场景
现在有四个项目A,B,C,D。打包后执行,发现日志配置不对。通过压缩软件(.7z)打开通过assembly打包的可执行'A.jar',发现里面的log4j.properties的配置是B的配置。
经过一番查错,比如调整pom配置,设置过滤之类的,也没用。
尝试的方法:
1.把B(甚至C和D都改了)的配置改成A的,结果生成的Jar包中还是原来的配置,也就是说,它调用的log4j配置文件,是存在于一个jar中(甚至不在class文件),并不是以文件形式存在。
2.调整了pom,如下,也没用;过滤B的配置文件
<dependency>
<groupId>com.A</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>B.pro</groupId>
<artifactId>log4j.properties</artifactId>
</exclusion>
</exclusions>
</dependency>
3.参考某个解决方案,把log4j的版本从1.2.14改为1.2.16,也没有用
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
解决方案
帮所有依赖的子工程,都进行‘clean’和'install'。因为如果你的pom中添加了B,C,D的依赖,那么IDEA会‘可能’优先去MAVEN仓库里找旧的配置。所以导致新的配置文件不生效。
所以,将A,B,C,D的配置都更改后,进行clean后install,相当于更新了本地仓库。这样,再用assembly打包,即可。
mvn clean package assembly:single -f pom.xml
通过这样的方式,最终打包A工程后,依赖的依然是B的log4j.properties文件,但是现在已经可以将A的配置替换给B的log4j.properties。但是这样其实并不是严谨的做法。
以下方案,通过修改B的pom.xml文件,在package和install阶段,直接排除B的log4j.properties。
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>log4j.properties</exclude>
</excludes>
</resource>
</resources>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
<executions>
<execution>
<id>exclude-log4j-properties</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
通过上述做法,B工程被package和install后,在本地maven仓库的B.jar包中,就不存在log4j.properties了。以此类推,B,C,D都可以这样排除log4j.properties的依赖,最终对A进行assembly打包,包含的配置就是A的log4j.properties
注意,整一个流程: