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

Sac*_*ach 11 java maven

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

外部图书馆

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

这两个版本是不兼容的.所以我已经设置了类路径,使得模块1将在搜索$ HOME/lib目录/模块1文件夹第一和单词数在$ 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>
Run Code Online (Sandbox Code Playgroud)

也是为了让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>
Run Code Online (Sandbox Code Playgroud)

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

lex*_*ore 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工件发生冲突,因此您很乐意在类路径中同时使用它们.


Sac*_*ach 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>
   
Run Code Online (Sandbox Code Playgroud)

并在assembly.xml中

   <fileSet>
        <directory>../../resources/lib</directory>
        <outputDirectory>${HOME}/lib/module1</outputDirectory>
        <directoryMode>755</directoryMode>
        <fileMode>644</fileMode>
        <includes>
            <include>jline-*</include>
        </includes>
    </fileSet>
Run Code Online (Sandbox Code Playgroud)

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