【问题标题】:Maven project depending on two versions of the same artifactMaven项目依赖于同一个工件的两个版本
【发布时间】:2015-01-24 16:37:54
【问题描述】:

我有一个项目,其中包含两个使用 sqlline 的单独模块和另一个依赖于 jline 的库(比如 OtherLib)。但是在不同的版本上。

外部库

Module1 使用 Sqlline 依赖于 jline 2.10
Module2 使用 OtherLib 依赖于 jline 0.9.94

而且这两个版本不兼容。 因此,我设置了类路径,以便 Module1 首先在 $HOME/lib/module1 文件夹中搜索,Module2 首先在 $HOME/lib 文件夹中搜索。

有没有办法指定maven先将工件下载到源目录(比如../resources/lib),然后在assembly.xml的打包时间将其复制到包中?

我知道从源目录复制可以使用以下代码。

<fileSets>
   <fileSet> 
        <directory>../resources/lib</directory>
        <outputDirectory>${HOME}/lib/module1</outputDirectory>
        <directoryMode>755</directoryMode>
        <fileMode>644</fileMode>
        <includes>
            <include>*.jar</include>
        </includes>
    </fileSet>
</fileSets>

还可以让 maven 下载我可以使用的依赖项(对于 Module2)

 <dependencySets>
    <dependencySet>
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>${HOME}/lib</outputDirectory>
        <directoryMode>755</directoryMode>
        <fileMode>644</fileMode>
        <includes>
            <include>jline:jline:jar:0.9.94</include>
        </includes>
    </dependencySet>
<dependencySets>

如何确保jline:jline:jar:2.10首先下载到../resources/lib文件夹?

【问题讨论】:

  • 两个不同的主要版本是否使用相同的完全限定类名?如果是这样,那么即使使用巧妙的类加载,您也会遇到麻烦。
  • @chrylis 幸运的是,两个版本之间发生了巨大的变化。所以到目前为止没有发现任何冲突。实际上,当我将 jar 手动添加到 ../resources/lib 时,这工作正常,但手动执行此操作对于该项目是不可接受的。
  • 如果我理解得很好,你的问题是在运行时,而不是编译时,对吧?你有一个多模块项目,两个模块之间没有依赖关系?模块是 jar-with-dependencies 项目吗?

标签: java maven


【解决方案1】:

我使用 ma​​ven-dependency-plugin

找到了答案 here

pom.xml

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.1</version>
         <executions>
           <execution>
               <id>copy-model</id>
               <phase>package</phase>
               <goals>
                  <goal>copy</goal>
               </goals>
               <configuration>
                 <artifactItems>
                   <artifactItem>
                       <groupId>jline</groupId>
                       <artifactId>jline</artifactId>
                       <version>2.10</version>
                       <type>jar</type>
                   </artifactItem>
                 <artifactItems>
                 <outputDirectory>../../resources/lib</outputDirectory>
               </configuration>
           </execution>
        </executions>
     </plugin>
   <plugins>  
 <build>
   

并且在 assembly.xml

   <fileSet>
        <directory>../../resources/lib</directory>
        <outputDirectory>${HOME}/lib/module1</outputDirectory>
        <directoryMode>755</directoryMode>
        <fileMode>644</fileMode>
        <includes>
            <include>jline-*</include>
        </includes>
    </fileSet>

jline-0.9.94 与任何其他依赖项一样包含在 dependencySet 中。 我希望这有帮助。 :)

【讨论】:

    【解决方案2】:

    如果您完全确定自己在做什么,您可以使用maven-shade-plugin 之类的方式重新打包其中一个版本。但请绝对确定,你在做什么。

    使用maven-shade-plugin,您可以创建一个新的Maven 模块,例如jline:jline_2_10:jar:1.0 并使用jline:jline:jar:2.10 作为依赖项。然后maven-shade-plugin 会将其打包到您的jline_2_10-1.0.jar 中。

    由于您的新工件有自己的 groupId:artifactId 组合,因此不会与其他 jline:jline:jar:0.9.94 工件发生冲突,因此您很乐意在类路径中同时拥有这两者。

    【讨论】:

    • 感谢您的回答。但我不确定这是否可行,因为我的程序使用的只有 jars 依赖于 jline 而不是我的应用程序直接。无论如何,我会为遇到同样问题的其他人发布我是如何排序的。
    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多