Проект Maven в зависимости от двух версий одного и того же артефакта

У меня есть проект с двумя отдельными модулями, которые используют sqlline и другую библиотеку (скажем, OtherLib), которая зависит от jline. Однако в разных версиях.

Внешние библиотеки

Модуль1 использует 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 для загрузки зависимости, которую я могу использовать (для модуля 2)

 <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?

Ответы

Ответ 1

Я нашел ответ здесь, используя 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 как любая другая зависимость. Надеюсь, это поможет. :)

Ответ 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 артефакт, так что вы с радостью будете иметь оба в пути к классам.