Jetty 1 内嵌启动

转载:http://www.jfinal.com/share/433


要说的是, 鄙人所说的方案和这篇文章 http://www.jfinal.com/share/422  没有多大关系, 只是看到这个文章之后, 分享下我这边的方案, 不是说更好的方案, 此方法是我之前自己项目中想要用 jetty 打包部署, 图方便, 这种方式, 提供一种不一样的参考.

方法和该文章所说的方式略有不同, 这里打包出来的结构并不是一个独立的 jar 包. 打包完成后的结构如下: /--    /conf    /bin    /lib conf 放置配置文件信息, bin 存放启动脚本 lib 存放 jar 包依赖 包括项目本身. 具体方式: pom.xml <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <groupId>com.example</groupId>   <artifactId>test</artifactId>   <version>1.0</version>   <packaging>jar</packaging>   <name>test</name>   <description>test</description>     <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     <maven.compiler.encoding>UTF-8</maven.compiler.encoding>     <pro-basedir>${project.basedir}</pro-basedir>     <project-charset>UTF-8</project-charset>     <version-java>1.8</version-java>       <version-jfinal>3.1</version-jfinal>     <version-jetty>9.4.6.v20170531</version-jetty>   </properties>     <dependencies>         <dependency>       <groupId>org.eclipse.jetty</groupId>       <artifactId>jetty-server</artifactId>       <version>${version-jetty}</version>     </dependency>       <dependency>       <groupId>org.eclipse.jetty</groupId>       <artifactId>jetty-webapp</artifactId>       <version>${version-jetty}</version>     </dependency>       <dependency>       <groupId>com.jfinal</groupId>       <artifactId>jfinal</artifactId>       <version>${version-jfinal}</version>       <exclusions>         <exclusion>           <groupId>cglib</groupId>           <artifactId>cglib-nodep</artifactId>         </exclusion>       </exclusions>     </dependency>     </dependencies>     <build>       <resources>       <resource>         <directory>${basedir}/src/main/resources</directory>         <filtering>true</filtering>       </resource>     </resources>     <testResources>       <testResource>         <directory>${basedir}/src/main/resources</directory>       </testResource>     </testResources>       <plugins>         <plugin>         <groupId>org.apache.maven.plugins</groupId>         <artifactId>maven-compiler-plugin</artifactId>         <configuration>           <source>${version-java}</source>           <target>${version-java}</target>         </configuration>       </plugin>         <plugin>         <groupId>org.apache.maven.plugins</groupId>         <artifactId>maven-source-plugin</artifactId>         <configuration>           <includePom>true</includePom>         </configuration>         <executions>           <execution>             <id>attach-sources</id>             <phase>verify</phase>             <goals>               <goal>jar-no-fork</goal>             </goals>           </execution>         </executions>       </plugin>         <plugin>         <groupId>org.apache.maven.plugins</groupId>         <artifactId>maven-jar-plugin</artifactId>         <configuration>           <includes>             <!-- 打jar包时,只打包class文件 -->             <include>**/*.class</include>           </includes>           <finalName>${project.artifactId}-${project.version}</finalName>         </configuration>       </plugin>         <plugin>         <groupId>org.apache.maven.plugins</groupId>         <artifactId>maven-assembly-plugin</artifactId>         <executions>           <execution>             <id>create-archive</id>             <phase>package</phase>             <goals>               <goal>single</goal>             </goals>             <configuration>               <tarLongFileMode>gnu</tarLongFileMode>               <appendAssemblyId>false</appendAssemblyId>               <attach>false</attach>               <finalName>${project.name}</finalName>               <appendAssemblyId>false</appendAssemblyId>               <descriptors>                 <descriptor>src/main/assembly/pkg.xml</descriptor>               </descriptors>               <outputDirectory>${project.build.directory}/dist/</outputDirectory>             </configuration>           </execution>         </executions>       </plugin>         <plugin>         <groupId>org.apache.maven.plugins</groupId>         <artifactId>maven-resources-plugin</artifactId>         <dependencies>           <dependency>             <groupId>org.apache.maven.shared</groupId>             <artifactId>maven-filtering</artifactId>             <version>1.3</version>           </dependency>         </dependencies>       </plugin>       </plugins>     </build>  </project> 是的, 用到了 assembly 插件, 来进行依赖包移动. 在 src/main 目录新增 assembly且创建 pkg.xml 文件. pkg.xml <?xml version="1.0" encoding="UTF-8"?><assembly>     <id>dist</id>   <formats>     <format>dir</format>     <format>tar.gz</format>   </formats>   <baseDirectory>${project.name}</baseDirectory>     <includeBaseDirectory>true</includeBaseDirectory>     <fileSets>     <fileSet>       <directory>${project.basedir}</directory>       <outputDirectory>/</outputDirectory>       <includes>         <include>README.md</include>       </includes>     </fileSet>     <fileSet>       <directory>${project.basedir}/src/main/resources</directory>       <includes>         <include>*</include>       </includes>       <outputDirectory>/conf</outputDirectory>       <filtered>true</filtered>     </fileSet>     <fileSet>       <directory>${project.basedir}/src/main/webapp</directory>       <outputDirectory>/conf/webapp</outputDirectory>     </fileSet>     <fileSet>       <directory>${project.basedir}/src/main/bin</directory>       <includes>         <include>*</include>       </includes>       <outputDirectory>/bin</outputDirectory>       <fileMode>0755</fileMode>     </fileSet>     <fileSet>       <directory>${project.basedir}/target</directory>       <includes>         <!-- dependencySets 只负责将依赖 jar 包移动到 lib, 项目本身手动移过去 -->         <include>test*.jar</include>       </includes>       <outputDirectory>/lib</outputDirectory>     </fileSet>   </fileSets>     <dependencySets>     <dependencySet>       <outputDirectory>/lib</outputDirectory>     </dependencySet>   </dependencySets></assembly> 这样, 整个配置就完成了, 执行 mvn package 指令进行打包, 就能得到一个 tar.gz的包, 解压后执行 /bin 目录中预先写好的 shell 脚本启动项目. 至于启动的代码怎么写, 这个就很简单了 Boot.java package com.example.test.core;   /**  * Created by iaceob on 2017/7/25.  */ public class LightSowBoot {       private void init() throws LightSowException {                  Boolean debug = PropKit.getBoolean("test.debug");           int model = ConfKit.getInt("test.model", 0);         if (model == 0)             throw new RuntimeException("未知的运作模式");       }       private String findWebdir() {         // 调试模式不自动寻找 webdir 地址, 直接在配置文件写死就好         if (PropKit.getBoolean("test.debug"))             return PropKit.get("test.webdir.debug");           // 正常模式下, 通过环境变量去寻找名称是 /webapp 的地址, web.xml 文件便放在这里面         try {             Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources("");             while (urls.hasMoreElements()) {                 URL url = urls.nextElement();                 if (!url.getPath().endsWith("/webapp/"))                     continue;                   File file = new File(url.getPath());                 if (!file.isDirectory())                     continue;                   return url.getPath();             }             return null;         } catch (IOException e) {             throw new RuntimeException("Can not find webapp.");         }     }       public void boot() {         PropKit.use("cfg.properties");         try {             this.init();         } catch (RuntimeException e) {             log.error(e.getMessage(), e);         }           int port = PropKit.getInt("test.srv.port");         try {             Server server = new Server(port);             WebAppContext ctx = new WebAppContext();               String webdir = findWebdir();               ctx.setResourceBase(webdir);             ctx.setDescriptor(String.format("%s/WEB-INF/web.xml", webdir));             ctx.setContextPath("/");             ctx.setParentLoaderPriority(true);             ctx.setConfigurations(new Configuration[]{                 new WebXmlConfiguration(),                 new WebInfConfiguration(),                 // new TagLibConfiguration(),                 new MetaInfConfiguration(),                 new FragmentConfiguration(),                 new JettyWebXmlConfiguration()             });               log.info("Server listen {}", port);               server.setHandler(ctx);             server.start();             server.join();         } catch (InterruptedException e) {             e.printStackTrace();         } catch (Exception e) {             e.printStackTrace();         }     }   } 到这里就结束了, web.xml 的内容就不用我贴了吧. 最后, 打包, 解压后的目录结构应该像这样 . |-conf |   |-webapp |         |-web.xml |-bin |   |-boot.sh |-lib     |-a.jar     |-b.jar 启动脚本可以看这里 啟動 Java 程序 Shell 腳本 题外话, 关于这个使用 jetty 的启动方式, 其实还可以继续玩下去, 达到不需要写 web.xml 配置文件, 只需要在进行一次封装即可, 重写 JfinalConfig 提供一个启动方法, 继承 Config 后写 main 方法调用即可.
相关文章

相关标签/搜索