43

我在互联网上搜索了很长一段时间,但我无法弄清楚如何配置 maven-war 插件或类似的东西,以便系统依赖项包含在内置战争中(WEB-INF/lib 文件夹)

在 jar-build 的情况下,我使用 maven 依赖插件:

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

4

7 回答 7

22

让我尝试总结一下我尝试过的选项:

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

这不行!此外,只有 jar 名称,不包括其他所有内容,所以如果您愿意尝试,请尝试

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

Jatin 的回答似乎有点复杂,我尝试一遍又一遍地检查 POM,以找出提到的要包含在 WEB-INF POM 中的系统 jar 的确切位置。

无论如何,我最终使用了这个解决方案,起初它不起作用,但经过一段时间后,一些更正起作用了:

我使用以下命令在本地存储库中安装了 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>

注意 - 请参阅我已评论系统范围和系统路径。

现在构建战争,在 WEB-INF/lib 中包含这个 LoginRadius-1.0.jar

于 2013-09-28T12:13:38.350 回答
18

如果偶然由于第三方进行了一些愚蠢的命名/打包检查而无法将第三方库安装到本地存储库中,您仍然可以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>

不确定,但我相信该库必须位于项目基目录的本地某个位置。我倾向于在 call 下创建一个目录src/main/lib保存这些类型的 3rd 方库。在构建过程中,它们被放置在正确的目录中并添加到 war 文件中。

于 2018-02-13T08:55:35.687 回答
7

您可以根据需要配置 war 插件以包含排除所有部分jar ,如下所述。简单而有效

           <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>
于 2019-01-24T05:56:38.513 回答
4

如果您的意思是 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>
于 2013-09-28T10:08:56.483 回答
3

根据您最初的 POM,我建议将它们直接发送到 WEB-INF/lib 目录

                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib</outputDirectory>
                    </configuration>
于 2015-09-03T16:37:51.763 回答
0
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>
于 2018-03-16T13:03:38.763 回答
0

这可能是定义依赖项的范围的问题:

  • compile:“编译”范围内的依赖项将作为 Maven 构建的一部分自动复制到目标的 WEB-INF/lib。
  • 提供:不会复制“提供”范围内的依赖项(您可以将其用于服务器提供的 jar,例如 JSP-api.jar)。

要在 Maven 中生成 WAR,必须运行 2 个目标:“compile”和“war:war”。单独运行战争目标不会编译 Java 源代码。如果您愿意,可以运行主要目标之一,例如“包”。

如果使用日食

在项目资源管理器中选择 POM,然后选择“运行”上下文菜单选项。这将构建并执行 Maven 运行配置文件(或使用现有配置文件)。Maven 运行配置文件的行为与常规运行/调试配置文件一样,只是它们的配置文件编辑对话框支持 Maven 特定的功能。

来源:https ://coderanch.com/t/594897/ide/include-maven-dependencies-war-file

于 2018-06-04T11:58:35.167 回答