Как включить системные зависимости в войну, построенную с использованием 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>

в моей POM, и эти зависимости не включены в WEB-INF/lib, когда война построена.

Ответ 1

Позвольте мне попытаться суммировать варианты, которые я пробовал:

<packagingIncludes>${java.home}/lib/jfxrt.jar</packagingIncludes>

Это не работает! Кроме того, только имя фляги исключает все остальное, поэтому, если вы хотите попробовать, попробуйте

<packagingIncludes>${java.home}/lib/jfxrt.jar,**/*</packagingIncludes>

Ответ Jatin показался мне немного сложным, и я снова и снова пытался пройти через POM, чтобы выяснить, где именно упомянутые системные jar включены в WEB-INF POM.

В любом случае, я решил использовать это решение, которое сначала не работало, но через некоторое время сработало:

Я установил jar в свой локальный репозиторий, используя следующую команду:

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

Ответ 2

Если вы случайно не сможете установить стороннюю библиотеку в локальный репозиторий, из-за некоторых глупых проверок именования/упаковки третьей стороной, вы можете добавить зависящие от system зависимости к вашему окончательному пакету во время сборки (по крайней мере, если вы строят webapp), используя 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/ called lib для хранения этих типов сторонних библиотек. Во время процесса сборки они помещаются в правильный каталог и добавляются в файл войны.

Ответ 3

Если вы имели в виду как jar-зависимости, то ниже приведен пример pom.xml, который берет необходимые файлы и генерирует военный файл:

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

Ответ 4

Основываясь на исходном POM, я бы предложил отправить их непосредственно в каталог WEB-INF/lib

                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib</outputDirectory>
                    </configuration>

Ответ 5

Вы можете настроить военный плагин так, чтобы он включал или исключал все или некоторые файлы в соответствии с вашими потребностями, как указано ниже. Просто и работает

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

Ответ 6

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

Ответ 7

Это может быть проблема области, в которой определены зависимости:

  • compile: Зависимости в области "компиляции" будут автоматически скопированы в целевой WEB-INF/lib как часть сборки Maven.
  • при условии: Зависимости в "предоставленной" области не будут скопированы (вы использовали бы это для серверных банок, таких как JSP-api.jar).

Чтобы создать ВОЙН в Maven, нужно запустить 2 цели: "компиляция" и "война: война". Только запуск цели войны не будет компилировать источник Java. Если вы предпочитаете, запустите одну из главных целей, например "пакет".

Если вы используете eclipse:

выберите POM в проводнике проекта и выберите опцию контекстного меню "Выполнить". Это приведет к созданию и выполнению профиля запуска Maven (или использование существующего). Профили Maven работают так же, как обычные профили запуска/отладки, за исключением того, что их диалоги редактирования профиля поддерживают определенные функции Maven.

источник: https://coderanch.com/t/594897/ide/include-maven-dependencies-war-file