18

我使用 Maven 程序集插件创建我的应用程序存档。我的 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>

源代码中的dependenvcy 解析器删除旧版本,存档中只打包了1.1.0

我尝试通过使用程序集 xml 描述符文件来包含 jar。而且我没有找到任何解决方案。

一种可能的解决方案是将所有需要的 model.jar 手动放入一个文件夹中,并告诉程序集将其复制到存档中。但我正在寻找一个更可配置的解决方案。

任何的想法 ?

4

4 回答 4

13

我通过使用 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>

现在我只需要在我的程序集 xml 中添加以下几行

    <fileSet>
        <directory>${project.build.directory}/lib</directory>
        <outputDirectory>/lib</outputDirectory>
        <filtered>false</filtered>
        <includes>
            <include>*.jar</include>
        </includes>
        <fileMode>0600</fileMode>
    </fileSet>
于 2010-11-30T14:11:14.177 回答
12

Maven 假设一次拥​​有多个版本的模块没有任何意义。它假定新版本替换旧版本。如果不是,则不是同一个模块。我建议您给较新的模块起一个不同的名称,并确保它具有不同的包,以避免选择随机模块。

总的来说,Maven 试图鼓励好的应用程序设计,并故意让做它认为是坏主意的事情变得困难。

于 2010-11-30T10:25:23.887 回答
1

另一个丑陋的解决方案可能是使用 WAR 文件覆盖,利用这种机制在应用覆盖时不关注组件 JAR 文件的版本这一事实。

于 2010-11-30T12:58:37.873 回答
1

我同意,不同的版本意味着替换旧版本。如果我们必须为某些业务需求使用两个不同版本的 Web 服务。在不同的包中生成存根是一个好主意,并且在添加到 maven 时,您可以在groupid. 这应该有效。

于 2016-02-10T17:50:36.443 回答