Maven的assembly插件使用:
最近在做一个小工程,利用java启动运行。
为了简单方便使用运行,利用maven的assembly将需要使用的jar都打包到一个jar中。这样无论拷贝到哪里,只有运行就可以,不用需要任何配置。
配置时指定mainClass,运行java的main函数时则可以不用指定包含main函数的类路径名。如运行下面的jar文件则非常简单方便(后台运行):nohup java -jar CalculateScore.jar &
第一步:需要在pom的xml中添加配置;
第二步:配置maven的Run Configurations,Goals配置成assembly:assembly即可。
上面的过程一直在使用,很正常。但最近的小应用却出了问题:
打出的jar包不产生日志文件,具体说是不生成log4j的日志信息,程序运行正常也不报错,任何提示都没有。
网上各种查询,没有结果。为了解决问题就各种尝试。
脑子里一直有疑问:以前的都正常使用,都可以打印日志,为什么这个就不行呢?
各种尝试都不行,于是就反编译jar包来看。结果发现log4j.properties文件不是自己的那个文件,不知道是哪个包里的,而自己程序中都使用的Logger.getLogger(name)的形式,所以都无法打印日志信息。
问题来了,为什么不是自己的那个log4j配置文件呢?
Maven打包的时候Console中都有日志信息,仔细查看发现,多次提示log4j的配置已经加入并跳过。
于是猜想:一定是打包的过程中,先加载了其他jar中的log4j的配置文件,而以后的包括自己应用中的log4j的配置文件都被忽略了。
可是问题又来了,自己以前使用同样的方式,也使用了很多第三方包,都包含有log4j的配置文件,为什么都没有问题呢?查看以前的打的包,log4j的配置文件都是自己工程中配置的,这是为什么呢?
于是就开始比较打包的配置过程是否有差别,又有新发现:
Maven打包的Run Configurations配置中有项Base directory,这里配置有问题。
如下面的两张图所示:
如果Base directory中配置的是通过Browse Workspace选择的工程就会产生上面的问题;
如果Base directory中配置的是通过Browse File System选择的文件地址路径就不会产生上面的问题。
具体为什么会出现这种情况,有待研究。
会产生问题的配置方式:
不会产生问题的配置方式: