Maven项目取决于同一工件的两个版本

时间:2014-11-26 11:12:48

标签: java maven

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

外部库

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

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

有没有办法指定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 个答案:

答案 0 :(得分: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工件发生冲突,因此您很乐意在类路径中同时拥有这两者。

答案 1 :(得分:3)

我使用 maven-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中。 我希望这有帮助。 :)