jfinal 3.7 fatjar 打包及配置文件外部引用

本文以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:个人太笨,搞得波总指导好多次,真的蛮不好意思的哈。第一次写分享,写的不好,不要见怪。





    

评论区

JFinal

2019-03-20 00:24

fatjar 现在用得越来越多了,已经写得很详细了, 赞

伊森

2019-03-20 08:56

@JFinal 确实是,公司现用的spring boot也转向这种方式了

rapin

2019-03-20 09:16

学习下

冰雨

2019-03-20 12:34

越分享,越获益!赞!