Java Maven程序集:添加同一工件的不同版本
我使用maven assembly插件创建应用程序归档。 我的pom中存在的所有依赖项都包括在内,没有任何问题 现在我需要包含同一工件的两个或多个版本 如果在我的pom中Java Maven程序集:添加同一工件的不同版本,java,maven-2,maven-plugin,maven-assembly-plugin,Java,Maven 2,Maven Plugin,Maven Assembly Plugin,我使用maven assembly插件创建应用程序归档。 我的pom中存在的所有依赖项都包括在内,没有任何问题 现在我需要包含同一工件的两个或多个版本 如果在我的pom中 <dependencies> [...] <dependency> <groupId>db.test</groupId> <artifactId>my-model</artifact
<dependencies>
[...]
<dependency>
<groupId>db.test</groupId>
<artifactId>my-model</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>db.test</groupId>
<artifactId>my-model</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
[...]
分贝试验
我的模型
1.0.3
分贝试验
我的模型
1.1.0
源DependencyResolver删除旧版本,只有1.1.0打包在存档中
我尝试使用程序集xml描述符文件包含jar。我没有找到任何解决办法
一个可能的解决方案是手动将所有需要的model.jar放在一个文件夹中,并告诉程序集将其复制到存档中。但我正在寻找一个更可配置的解决方案
有什么想法吗?Maven认为一次拥有一个以上版本的模块没有任何意义。它假定较新的版本替换较旧的版本。如果没有,则不是同一个模块。我建议您为较新的模块指定不同的名称,并确保它具有不同的包,以避免选择随机模块
总的来说,Maven试图鼓励良好的应用程序设计,并故意使其难以完成它认为不好的事情。另一个丑陋的解决方案可能是使用WAR文件覆盖,利用这个机制在应用覆盖时不注意组件JAR文件的版本这一事实。我找到了一个解决方案,使用maven dependency plugin复制解析的pom依赖项和额外的JAR
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>runtime</includeScope>
</configuration>
</execution>
<execution>
<id>copy-model</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>my.test.pkg</groupId>
<artifactId>my-model</artifactId>
<classifier>server</classifier>
<version>1.0.3</version>
<type>jar</type>
</artifactItem>
<artifactItem>
<groupId>my.test.pkg</groupId>
<artifactId>my-model</artifactId>
<classifier>server</classifier>
<version>1.1.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
org.apache.maven.plugins
maven依赖插件
2.1
复制依赖项
包裹
复制依赖项
${project.build.directory}/lib
假的
假的
真的
运行时
复制模型
包裹
复制
my.test.pkg
我的模型
服务器
1.0.3
罐子
my.test.pkg
我的模型
服务器
1.1.0
罐子
${project.build.directory}/lib
现在我只需要在我的汇编xml中添加以下行
<fileSet>
<directory>${project.build.directory}/lib</directory>
<outputDirectory>/lib</outputDirectory>
<filtered>false</filtered>
<includes>
<include>*.jar</include>
</includes>
<fileMode>0600</fileMode>
</fileSet>
${project.build.directory}/lib
/解放党
假的
*jar先生
0600
我同意,不同的版本意味着替换旧版本。如果我们必须为某些业务需求使用两个不同版本的Web服务。在不同的包中生成存根是一个好主意,当添加到maven时,您可以在groupid
中指定不同的存根。这应该行得通。不用担心需求/冲突/。。这个jar有不同的类和不同的包名。它们将通过使用ServiceLoader构建不同的xml模型来加载,以保持兼容性。我认为对我来说,这不是一个坏习惯。我会试着看看是否有可能在每个发行版上都改名,而且不会让人觉得无聊。我会保证改名两个,如果你同时使用这两个的话。当然是的!一切都是不同的,只是groupeid和artifactid是相同的。我们需要在发行版中提供多个不同版本的数据库驱动程序,以便我们的应用程序能够支持不同的数据库遗留版本和当前版本。它们都是相同的groupId:artifactId,但版本不同。我们当然会将它们打包到.zip中单独的子目录中。但是maven不应该在不考虑每个用例的情况下假设太多。创建maven的原因是,您需要为Java构建指定太多的细节,以至于无法手动完成所有事情,这正是ant要求您的。因此,maven总是通过设计来假设。只是,它(几乎)总是有办法更改它假定的每一个可能的默认值。我可能会问,当两个版本都加载到jvm时,是否应该这样做?我有完全相同的要求,并且您的解决方案节省了时间@lucky_start_izumi-在大多数情况下都是这样,但在我的情况下,它适用于使用YAJSW的应用程序,它需要一个较旧的库,而我的应用程序需要一个较新的库。在我的场景中,它们运行在不同的类路径上。