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