本文以jfinal club 项目为例(还没加入俱乐部的同志们赶紧加哈),讲下如何利用jfinal-undertow 将web 工程打成jar 包,同时将配置文件外部应用,这样的话,运行web ,只需要java -jar jfinal-club.jar 就可以启动,同时数据库配置文件如果发生修改(比如数据库ip,用户或密码发生改变),也不需要重新打包。
需要提一点的是如果undertow 的配置发生变化,port/host/resourcePath/ioThreads/workerThreads 这5个参数是可以在命令行启动中通过-D 的方式注入的 ,例如:
java -jar -Dundertow.port=8080 -Dundertow.host=0.0.0.0 jfinal-club.jar 。
以下是简单的步骤(其实整个步骤 在 jfinal club 的doc 文档中有)
1) 修改pom.xml ,将原来的maven-jar-plugin、maven-assembly-plugin 这两个<plugin> 标签去掉。
2)在<plugins>标签下,新增加如下两个<plugin>标签。
<plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>copy-webapp</id> <phase>process-sources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <encoding>UTF-8</encoding> <outputDirectory>${basedir}/target/classes/webapp</outputDirectory> <resources> <resource> <directory>${basedir}/src/main/webapp</directory> <includes> <!-- <include>**/*.xml</include> --> <!-- <include>**/**</include> --> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalName>jfinal-club</finalName> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.jfinal.club.common.JFinalClubConfig</mainClass> </transformer> <!-- 下面的配置支持排除指定文件打包到 jar 之中,可以用于排除需要修改的配置文件以便于在外部的 config 目录下的 同名配置文件生效,建议使用 Prop.appendIfExists(xxx_pro.txt) 在外部放一个非同名配置来覆盖开发环境的配置 则可以不用使用下面的配置,文档参考: http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer --> <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> <resources> <!-- <resource>demo-config-dev.txt</resource> --> <!-- <resource>.PDF</resource> --> <!-- <resource>READ.md</resource> --> </resources> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
3)undertow.txt 中此行注释打开
undertow.resourcePath=src/main/webapp, classpath:webapp
4)JFinalClubConfig 类中的configEngine 方法,添加如下两行:
me.setBaseTemplatePath("webapp"); me.setToClassPathSourceFactory();
5)mvn clean package 打fatjar 包(所有的东西都在一个jar 里面,包括web静态资源和所有引用的jar包)
6)在jar 包所在目录,新建config 目录,复制jfinal-club-config-dev.txt 到config 目录,并改名为:jfinal-club-config-pro.txt
7)在jar 包所在目录,执行java -jar jfinal-club.jar ,运行正常。
8)将mysql 的数据库密码修改为新密码,再次执行java -jar jfinal-club.jar ,应该会报错。
9)将jar 包平级config 目录中jfinal-club-config-pro.txt 中的数据库密码修改为新密码。
10)再次运行java -jar jfinal-club.jar ,运行正常。证明fat jar 的数据库配置文件外部引用生效。以后数据库url 或用户名,密码发生改变,就修改config目录中的jfinal-club-config-pro.txt即可。(我正在研究使用WatchService 来监控jfinal-club-config-pro.txt 的变化,并触发刷新数据库连接池的plugin ,这样重启都不需要了)。
11)加载配置文件,有两种写法:
1.p = PropKit.use("jfinal-club-config-dev.txt").appendIfExists("jfinal-club-config-pro.txt"); 2.p = PropKit.useFirstFound("file:config/jfinal-club-config-pro.txt","jfinal-club-config-dev.txt");
对于第一种写法appendIfExists 适用于生产环境与开发环境有很多一模一样的配置的场景,这个时候jfinal-club-config-pro.txt 中可以只配置与测试环境中有差异的配置即可。
对于第二种写法,只会使用jfinal-club-config-pro.txt 中的全配置,和jfinal-club-config-dev.txt 完全无关。
总结就是:
你需要追加覆盖,用 appendIfExists 即可
你需要二选一, 用 useFirstFound即可
ps:个人太笨,搞得波总指导好多次,真的蛮不好意思的哈。第一次写分享,写的不好,不要见怪。