Java Maven程序集:添加同一工件的不同版本

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

我使用maven assembly插件创建应用程序归档。 我的pom中存在的所有依赖项都包括在内,没有任何问题

现在我需要包含同一工件的两个或多个版本

如果在我的pom中

<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的应用程序,它需要一个较旧的库,而我的应用程序需要一个较新的库。在我的场景中,它们运行在不同的类路径上。