问题描述
我有一个Java应用程序,它使用Apache POI作为依赖项以及其他jar,所有这些jar都由maven管理,并且部署在具有旧版本的Apache POI及其依赖项的Tomcat服务器上。我的问题是,当我在本地测试应用程序时,它使用的是应用程序内部的罐子,即新版本;当我在docker容器中运行时,它使用的是Tomcat服务器上的罐子(旧版本)。当放置在Docker容器上时,如何固定应用程序在内部而不是外部运行和使用其jar?我已经使用过shad maven插件,但是很难,因为服务器上有许多旧的jar,我无法为所有内容着色。
解决方法
我将插件更改为从maven生成生成jar到maven组件:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
通过这种方式,应用程序可以在jar中包含所有需要的内容,而不必使用服务器中的旧类。而且也不需要遮盖所有的罐子。