Сборка Maven 2 с зависимостями: jar under scope "system" не входит в комплект
Я использую плагин maven-assembly, чтобы создать банку моего приложения, включая его зависимости следующим образом:
<assembly>
<id>macosx</id>
<formats>
<format>tar.gz</format>
<format>dir</format>
</formats>
<dependencySets>
<dependencySet>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
(я пропустил некоторые другие вещи, которые не связаны с вопросом)
До сих пор это работало нормально, потому что он создает каталог lib
со всеми зависимостями. Однако недавно я добавил новую зависимость, область видимости которой system
, и она не копирует ее в каталог вывода lib
. я должен упустить что-то основное здесь, поэтому я обращаюсь за помощью.
Зависимость, которую я только что добавил:
<dependency>
<groupId>sourceforge.jchart2d</groupId>
<artifactId>jchart2d</artifactId>
<version>3.1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>
Единственным способом, которым я мог включить эту зависимость, было добавление следующего элемента сборки:
<files>
<file>
<source>external/jchart2d-3.1.0.jar</source>
<outputDirectory>lib</outputDirectory>
</file>
</files>
Тем не менее, это заставляет меня изменять pom и файл сборки всякий раз, когда эта банка переименовывается, если вообще когда-либо. Кроме того, это выглядит просто неправильно.
Я пробовал с <scope>runtime</scope>
в dependencySets
и <include>sourceforge.jchart2d:jchart2d</include>
без везения.
Итак, как вы включаете банку system
в свой файл сборки в maven 2?
Спасибо большое
Ответы
Ответ 1
Я не удивлен, что зависимости в области системной области не добавляются (ведь зависимости с областью системы должны быть явно предоставлены по определению). Фактически, если вы действительно не хотите помещать эту зависимость в свой локальный репозиторий (например, потому что вы хотите распространять ее как часть своего проекта), это то, что я сделал бы:
- Я бы поместил зависимость в "репозиторий файловой системы" локально для проекта.
-
Я бы назвал этот репозиторий в моем pom.xml
следующим образом:
<repositories>
<repository>
<id>my</id>
<url>file://${basedir}/my-repo</url>
</repository>
</repositories>
-
Я бы просто объявил артефакт без области system
, это просто источник проблем:
<dependency>
<groupId>sourceforge.jchart2d</groupId>
<artifactId>jchart2d</artifactId>
<version>3.1.0</version>
</dependency>
Я не уверен на 100%, что это подойдет вашим потребностям, но я считаю это лучшим решением, чем использование области системы.
Обновление: Я должен был упомянуть об этом в своем первоначальном ответе, и теперь я его исправляю. Чтобы установить стороннюю библиотеку в файловом репозитории, используйте install:install-file
с параметром localRepositoryPath
:
mvn install:install-file -Dfile=<path-to-file> \
-DgroupId=<myGroup> \
-DartifactId=<myArtifactId> \
-Dversion=<myVersion> \
-Dpackaging=<myPackaging> \
-DlocalRepositoryPath=<path-to-my-repo>
Вы можете вставить это как в оболочке * nix. В окнах удалите "\
" и поместите все в одну строку.
Ответ 2
Btw вы можете автоматизировать его и сделать его частью вашей сборки maven. Следующее установит вашу банку в ваш локальный репозиторий перед компиляцией:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>validate</phase>
<configuration>
<file>${basedir}/lib/your-lib.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>your-group</groupId>
<artifactId>your-artifact</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
Ответ 3
Я нахожу легкое решение, если вы создаете jar
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<directory>dependencies/mydep</directory>
<targetPath>WEB-INF/lib</targetPath>
<filtering>true</filtering>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
Ответ 4
Вы также можете обработать это, добавив дополнительный набор зависимостей в свои зависимости.
<dependencySet>
<scope>system</scope>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>
Лучше всего использовать диспетчер репозитория (например, Nexus, Artifactory, Archiva) и установить такую зависимость в конкретном репозитории. После этого вы можете использовать такие вещи, как простая зависимость. Это упростит вашу жизнь.
Документы: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
Ответ 5
Простое решение для этого - добавить его в локальный репозиторий maven
Один из способов сделать это через команды установки mvn, как это было предложено в предыдущем сообщении.
Другим простым способом является,
1) В своем идеале eclipse правой кнопкой мыши выберите вариант выбора Maven.
2) Выберите "Установить или развернуть артефакт" в репозитории maven и нажмите "Далее".
3) Установите флажок рядом с файлом Artifact и выберите файл jar
4) Введите GroupId и ArtifactId, и версия обеспечит создание pom и создайте контрольную сумму, а упаковка будет jar
Нажмите на финиш, Валлах!!! ваша работа завершена, банку добавляется в ваш локальный репозиторий, который вы можете определить в каталоге settings.xml или m2
Теперь просто добавьте простую зависимость maven в соответствии с версией GroupId, ArtifactId и jar, которую вы ввели в соответствии с импортом, и что ваша внешняя банка будет упакована maven.
Ответ 6
Отредактировано: Извините, что я не осознал, что alx также упомянул об обходном пути чистого жизненного цикла.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>hack-binary</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/lib/your-lib.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>your-group</groupId>
<artifactId>your-artifact</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
Основываясь на решении, предоставленном alx, вы можете выполнить шаг установочного файла на чистой фазе. но поскольку чистая фаза не находится в жизненном цикле по умолчанию, вы должны выполнить mvn clean
в первый раз, чтобы гарантировать, что банка готова в локальном репо.
ex: mvn clean; mvn package