Как включить системные зависимости в войну, построенную с помощью Maven
Я довольно долго искал в интернете и не могу понять, как настроить плагин maven-war или что-то подобное, чтобы системные зависимости были включены во встроенную войну (папка WEB-INF/lib)
Я использую плагин зависимостей maven в случае jar-build как:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
но я не могу понять, что делать в случае войны. Я пытался использовать плагин maven-war, но он не включает системные зависимости в сборке.
[ОБНОВИТЬ]
У меня есть зависимости типа:
<dependency>
<groupId>LoginRadius</groupId>
<artifactId>LoginRadius</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\lib\LoginRadius-1.0.jar</systemPath>
</dependency>
в моем ПОМ, и эти зависимости не включены в WEB-INF/lib, когда идет сборка.
6 ответов
Позвольте мне попытаться суммировать варианты, которые я пробовал:
<packagingIncludes>${java.home}/lib/jfxrt.jar</packagingIncludes>
Это не работает! Кроме того, только имя фляги исключает все остальное, поэтому, если вы хотите попробовать, попробуйте
<packagingIncludes>${java.home}/lib/jfxrt.jar,**/*</packagingIncludes>
Ответ Джатина показался мне немного сложным, и я снова и снова пытался просмотреть POM, чтобы выяснить, где именно упомянутые системные банки были включены в WEB-INF POM.
В любом случае, я решил использовать это решение, которое сначала не работало, но через некоторое время сработало:
installed the jar in my local repository
используя следующую команду:
mvn install:install-file -Dfile="C:\Users\hp\Documents\NetBeansProjects\TwitterAndLoginRadiusMaven\lib\LoginRadius-1.0.jar" -DgroupId=LoginRadius -DartifactId=LoginRadius -Dversion=1.0 -Dpackaging=jar
После выполнения вышеуказанной команды я изменил зависимость в POM на
<dependency>
<groupId>LoginRadius</groupId>
<artifactId>LoginRadius</artifactId>
<!--<scope>system</scope>-->
<version>1.0</version>
<!--<systemPath>${basedir}\lib\LoginRadius-1.0.jar</systemPath>-->
</dependency>
ПРИМЕЧАНИЕ. - См., Что я прокомментировал область действия системы и systemPath.
Строя войну сейчас, включает этот LoginRadius-1.0.jar в WEB-INF/lib
Если по какой-либо причине вы не можете установить стороннюю библиотеку в локальный репозиторий, из-за некоторых глупых проверок имен / пакетов третьей стороной, вы все равно можете добавить свою system
зависимостей в конечный пакет во время сборки (по крайней мере, если вы создаете веб-приложение), используя maven-war-plugin
где вам нужно будет создать такую конфигурацию.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<failOnMissingWebXml>true</failOnMissingWebXml>
<webResources>
<resource>
<directory>path/to/lib/in/project</directory>
<targetPath>WEB-INF/lib</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
Не уверен, но я считаю, что библиотека должна находиться где-то локально по отношению к базовому каталогу проекта. Я склонен создавать каталог под src/main/
называется lib
держать эти виды сторонних библиотек. В процессе сборки они помещаются в правильный каталог и добавляются в файл war.
Вы можете настроить военный плагин так, чтобы все или некоторые файлы были включены или исключены в соответствии с вашими потребностями, как указано ниже. Просто и работает
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<webResources>
<resource>
<directory>${project.basedir}\lib</directory>
<targetPath>WEB-INF/lib</targetPath>
<filtering>false</filtering>
<includes>
<include>**/*.jar</include>
</includes>
<excludes>
<include>**/javax.servlet-api-3.1.0.jar</include>
</excludes>
</resource>
</webResources>
</configuration>
</plugin>
Если вы имели в виду jar-зависимости, то ниже приведен пример файла pom.xml, который берет необходимые файлы и генерирует файл war:
<build>
<defaultGoal>install</defaultGoal>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${project.basedir}/target/classes</outputDirectory>
<testOutputDirectory>${project.basedir}/target/test-classes</testOutputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<debug>true</debug>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<includeEmptyDirs>true</includeEmptyDirs>
<webResources>
<resource>
<directory>ui</directory>
<targetPath></targetPath>
<includes>
<include>**</include>
</includes>
</resource>
<resource>
<directory>lib</directory>
<targetPath>WEB-INF</targetPath>
<includes>
<include>**/*.xml</include>
<include>**/log4j.properties</include>
</includes>
</resource>
//edited below
<resource>
<directory>lib</directory>
<targetPath>WEB_INF/lib</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
<webXml>${project.basedir}/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
Исходя из вашего исходного POM, я бы посоветовал отправить их прямо в каталог WEB-INF/lib
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib</outputDirectory>
</configuration>
mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \
-Dfile=~/Desktop/medici-1.0.1.jar \
-DgroupId=com.hp \
-DartifactId=medici \
-Dversion=1.0.1 \
-Dpackaging=jar \
-DlocalRepositoryPath=lib
Если все прошло хорошо, вы можете найти свой артефакт, опубликованный внутри lib.
project$ find lib
lib
lib/com
lib/com/hp
lib/com/hp/medici
lib/com/hp/medici/1.0.1
lib/com/hp/medici/1.0.1/medici-1.0.1.jar
lib/com/hp/medici/1.0.1/medici-1.0.1.pom
lib/com/hp/medici/maven-metadata-local.xml
Note the structure here mimics what you’d find in ~/.m2.
Теперь в вашем pom.xml объявите его в своем проекте как хранилище Maven.
<repositories>
<repository>
<id>local-repo</id>
<url>file://${basedir}/lib</url>
</repository>
</repositories>
И, наконец, в вашем pom.xml объявите зависимость от локального.jar, как вы это сделали бы для любой зависимости.
<dependencies>
<dependency>
<groupId>com.hp.medici</groupId>
<artifactId>medici</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
Это может быть проблема области, где определены зависимости:
- compile: Зависимости в области "compile" будут автоматически скопированы в целевой WEB-INF/lib как часть сборки Maven.
- при условии: Зависимости в "предоставленной" области не будут скопированы (вы должны использовать это для предоставленных сервером jar, таких как JSP-api.jar).
Чтобы создать WAR в Maven, нужно выполнить 2 цели: "compile" и "war:war". Выполнение цели войны само по себе не скомпилирует исходный код Java. Если вы предпочитаете, запустите одну из основных целей, например, "пакет".
При использовании затмения:
выберите POM в проводнике проекта и выберите пункт контекстного меню "Выполнить". Это создаст и выполнит профиль запуска Maven (или использует существующий). Профили запуска Maven ведут себя так же, как обычные профили запуска / отладки, за исключением того, что их диалоги редактирования профиля поддерживают специфичные для Maven функции.
источник: https://coderanch.com/t/594897/ide/include-maven-dependencies-war-file