基于两个版本的同一依赖项的Maven项目

12

我的项目有两个单独的模块,使用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 文件夹中?


2
这两个不同的主要版本是否使用相同的完全限定类名?如果是,即使使用聪明的类加载,您也会遇到麻烦。 - chrylis -cautiouslyoptimistic-
@chrylis 幸运的是,这两个版本之间存在巨大的变化。到目前为止还没有发现冲突。实际上,当我手动将jar添加到../resources/lib时,它可以正常工作,但对于这个项目来说,手动操作是不可接受的。 - Sach
如果我理解正确的话,你的问题是在运行时而不是编译时出现了,对吗?并且你有一个多模块项目,两个模块之间没有依赖关系?这些模块是带有依赖项的jar项目吗? - Samuel EUSTACHI
2个回答

8
如果你确定你在做什么,可以使用类似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构件发生冲突,因此你可以在类路径中轻松使用两者。

谢谢您的回答。但我不确定这是否有效,因为只有我的程序使用的JAR依赖于jline,而不是直接依赖于我的应用程序。无论如何,我会发布我是如何解决这个问题的,以帮助其他遇到同样问题的人。 - Sach

4
我发现一个使用 maven-dependency-plugin 的答案在这里
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 的一部分被包含在内。

希望这可以帮到你。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接