要说的是, 鄙人所说的方案和这篇文章 http://www.jfinal.com/share/422 没有多大关系, 只是看到这个文章之后, 分享下我这边的方案, 不是说更好的方案, 此方法是我之前自己项目中想要用 jetty 打包部署, 图方便, 这种方式, 提供一种不一样的参考.
方法和该文章所说的方式略有不同, 这里打包出来的结构并不是一个独立的 jar 包.
打包完成后的结构如下:/--
/conf
/bin
/lib
conf 放置配置文件信息, bin 存放启动脚本 lib 存放 jar 包依赖 包括项目本身.
具体方式:
pom.xml<?xml version="1.0" encoding="UTF-8"?>
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">
com.example
test
1.0
jar
test
test
UTF-8
UTF-8
${project.basedir}
UTF-8
1.8
3.1
9.4.6.v20170531
org.eclipse.jetty
jetty-server
${version-jetty}
org.eclipse.jetty
jetty-webapp
${version-jetty}
com.jfinal
jfinal
${version-jfinal}
cglib
cglib-nodep
${basedir}/src/main/resources
true
${basedir}/src/main/resources
org.apache.maven.plugins
maven-compiler-plugin
${version-java}
${version-java}
org.apache.maven.plugins
maven-source-plugin
true
attach-sources
verify
jar-no-fork
org.apache.maven.plugins
maven-jar-plugin
**/*.class
${project.artifactId}-${project.version}
org.apache.maven.plugins
maven-assembly-plugin
create-archive
package
single
gnu
false
false
${project.name}
false
src/main/assembly/pkg.xml
${project.build.directory}/dist/
org.apache.maven.plugins
maven-resources-plugin
org.apache.maven.shared
maven-filtering
1.3
是的, 用到了 assembly 插件, 来进行依赖包移动. 在 src/main 目录新增 assembly且创建 pkg.xml 文件.
pkg.xml<?xml version="1.0" encoding="UTF-8"?>
dist
dir
tar.gz
${project.name}
true
${project.basedir}
/
README.md
${project.basedir}/src/main/resources
*
/conf
true
${project.basedir}/src/main/webapp
/conf/webapp
${project.basedir}/src/main/bin
*
/bin
0755
${project.basedir}/target
test*.jar
/lib
/lib
这样, 整个配置就完成了, 执行 mvn package 指令进行打包, 就能得到一个 tar.gz的包, 解压后执行 /bin 目录中预先写好的 shell 脚本启动项目.
至于启动的代码怎么写, 这个就很简单了
Boot.javapackage 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 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
题外话, 关于这个使用 jetty 的启动方式, 其实还可以继续玩下去, 达到不需要写 web.xml 配置文件, 只需要在进行一次封装即可, 重写 JfinalConfig 提供一个启动方法, 继承 Config 后写 main 方法调用即可.