Maven добавляет банки через systemPath/систему, но не добавляется в войну или где-либо еще
Я хочу добавить файл jar через systemPath из локальной файловой системы относительно моей структуры каталога проекта, а не в удаленный репозиторий. Я добавил объявление зависимости, но maven ничего не делает с ним.
В объявлении ниже я хочу, чтобы файл jar был скопирован в мой целевой каталог web-inf/lib, а также jarred как часть военного файла. В настоящее время этого не происходит. Как я могу получить файл jar, скопированный в мой военный файл?
Это вывод из режима debug maven:
DEBUG] cglib:cglib-nodep:jar:2.2:test (setting scope to: compile)^M
DEBUG] Retrieving parent-POM: org.objenesis:objenesis-parent:pom:1.2 for project: null:objenesis:ja
DEBUG] org.objenesis:objenesis:jar:1.2:test (selected for test)^M
DEBUG] org.javap.web:testRunWrapper:jar:1.0.0:system (selected for system)^M
DEBUG] Plugin dependencies for:
...
<dependency>
<groupId>org.javap.web</groupId>
<artifactId>testRunWrapper</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/testRunWrapper.jar</systemPath>
</dependency>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>WebContent</directory>
</resource>
</webResources>
</configuration>
</plugin>
Ответы
Ответ 1
ОК, я сделал следующее: Обратите внимание на структуру каталогов внизу.
При подходе ниже, файл jar из относительного пути проекта рассматривается как гражданин первого класса, как и другие банки. В приведенном ниже списке исправлена моя оригинальная проблема. В приведенном ниже списке pom.xml файл jar копируется в мой целевой каталог.
<repositories>
<repository>
<id>JBoss</id>
<name>JBoss Repository</name>
<layout>default</layout>
<url>http://repository.jboss.org/maven2</url>
</repository>
<repository>
<id>my-local-repo</id>
<url>file://${basedir}/lib/repo</url>
</repository>
</repositories>
<dependency>
<groupId>testRunWrapper</groupId>
<artifactId>testRunWrapper</artifactId>
<version>1.0.0</version>
</dependency>
$ find repo
repo
repo/testRunWrapper
repo/testRunWrapper/testRunWrapper
repo/testRunWrapper/testRunWrapper/1.0.0
repo/testRunWrapper/testRunWrapper/1.0.0/testRunWrapper-1.0.0.jar
Ответ 2
Использование плагина зависимостей maven выполняет задание:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
<includeScope>system</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ответ 3
Не используйте систему. Чтобы сделать то, что вы хотите, просто объявите как регулярную (компиляцию) зависимость и используйте mvn install: install-file в свой локальный репозиторий. Все остальное будет работать так, как вы хотите (lib будет скопирован и т.д.). Это будет означать, что сборка будет работать только на вашей машине.
Чтобы правильно исправить это для вашей (внутренней) команды, вам нужно будет создать репозиторий (например, Artifactory, Nexus или Archiva). Это почти необходимо для коллективного использования Maven.
Если это для общедоступного (например, с открытым исходным кодом), вы можете либо имитировать репозиторий через http-сервер, либо разместить реальный репозиторий.
Ответ 4
AFAIK, зависящие от системы зависимости, как и те, которые имеют предоставленную область действия, не входят в целевой артефакт. Почему вы не устанавливаете зависимость в своем локальном репозитории?
Из документа:
системы
Этот объем аналогичен предоставленному, за исключением того, что вы должны предоставить JAR, который содержит его явно. Артефакт всегда доступен и не просматривается в репозитории.
Ответ 5
попробуйте что-то вроде этого (используя плагин Ant, чтобы вручную поместить jar в выходной каталог):
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy file="${project.basedir}/pathToJAR.jar"
todir="${project.build.directory}/outputFileName/WEB-INF/lib"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
Ответ 6
Проблема с использованием ссылки на файловую систему заключается в том, что зависимые проекты не смогут глобально получить доступ к этому файлу jar. то есть зависимый проект ${basedir} отличается и, следовательно, файл .jar не будет найден.
Глобальные репозитории, с другой стороны, универсальны.
Ответ 7
В случае, если этот ответ не сработал для вас, поскольку это не для меня, и вы знаете, что system
- это плохая область, вы можете попробовать это где вы Установка флага с помощью установочного плагина (прокрутка вниз), который устанавливает JAR в ваш фактический локальный репозиторий Maven, В основном вам нужно добавить этот плагин только к pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>myGroupId</groupId>
<artifactId>myArtifactId</artifactId>
<version>myVersion</version>
<packaging>jar</packaging>
<file>${basedir}/lib/xxx.jar</file>
</configuration>
</execution>
</executions>
</plugin>
Заполните соответствующие значения для groupId
, artifactId
и version
и поместите исходный файл jar в <project-home>/lib
-каталог и исправьте file
выше. Вы можете добавить больше execution
-секций, но не забудьте добавить id
туда, например:
<execution>
<id>common-lib</id>
Каждому, кто обновляется из кода-репо, нужно вызвать mvn initialize
один раз.
И все энтузиасты Eclipse могут добавить это в pom.xml
, чтобы избавиться от ошибок в Eclipse:
<pluginManagement>
<plugins>
<!-- This plugin configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<versionRange>[2.4,)</versionRange>
<goals>
<goal>install-file</goal>
</goals>
</pluginExecutionFilter>
<action>
<execute></execute>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>