【问题标题】:Maven assembly : add different version of the same artifactMaven 程序集:添加同一工件的不同版本
【发布时间】:2011-05-17 18:53:48
【问题描述】:

我使用 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 手动放入一个文件夹中,并告诉程序集将其复制到存档中。但我正在寻找更可配置的解决方案。

有什么想法吗?

【问题讨论】:

  • 不用担心需要/冲突/.. 其他任何事情。

标签: java maven-2 maven-plugin maven-assembly-plugin


【解决方案1】:

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

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

【讨论】:

  • 这个 jar 有不同的类和不同的包名。它们将通过使用 ServiceLoader 来加载以构建不同的 xml 模型以保持兼容性。我认为就我而言,这不是一个坏习惯。我会尝试看看是否可以在每个版本上更改名称并且不会无聊。
  • 如果您要同时使用这两个名称,我会担保名称更改两个。
  • 当然可以!一切都不一样,只有 groupeid 和 artifactid 相同。
  • 我们需要在我们的发行版中发布多个不同版本的数据库驱动程序,以便我们的应用程序可以支持不同的旧版本和当前版本的数据库。它们都是相同的 groupId:artifactId 但版本不同。我们当然会将它们打包在 .zip 中的单独子目录中。但是 maven 不应该假设这么多,而不考虑每个用例。
  • 创建 maven 的原因是,您需要为 Java 构建指定太多细节,以至于手动完成所有事情是无法管理的——这就是 ant 对您的要求。因此,maven always 按照设计假设。只是,它也(几乎)总是有办法改变它假设的每一个可能的默认值。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 可能会问,如果你这样做,当两个版本都加载到jvm时,不应该有冲突吗?
    • 我有完全相同的要求,您的解决方案节省了时间。 @lucky_start_izumi - 在大多数情况下都可以,但在我的情况下,它适用于使用 YAJSW 的应用程序,它需要一个较旧的库,而我的应用程序需要一个较新的库。在我的场景中,它们在不同的类路径上运行。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多