【问题标题】:How to include system dependencies in war built using maven如何在使用 maven 构建的战争中包含系统依赖项
【发布时间】:2013-10-04 15:08:24
【问题描述】:

我在互联网上搜索了很长时间,但我无法弄清楚如何配置 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 中。

【问题讨论】:

标签: java eclipse maven


【解决方案1】:

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

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

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

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

【讨论】:

  • 因此,Maven“原教旨主义者”并不在意您现在不能有一个由(仅)以下步骤组成的两步​​构建:(1)从源代码管理中获取; (2) 键入单个构建命令(无论是 mvn、ant、make 还是 build.{sh|bat})。这个“解决方案”,我没有责怪你,它似乎只是 Maven 的一部分,现在有一个依赖项,你可以运行这个神奇的“安装”咒语将东西放在 ~/.m2/ 缓存目录中,或者,在 Maven Central 前面拥有一个工作组“Nexus”类型的缓存,您也有权将其“部署”到其中。
  • Maven 的依赖管理模型在您引入 Apache 和 Spring 库时效果很好,但当您拥有不希望在 Maven Central 中的供应商提供的库(jar)时效果就不那么好了:-(
  • 我同意。将所有内容放入存储库的需求在 Maven 中是一个真正的不足之处,因为实际上可能有一些人可能不想这样做(比如有一个不值得为其创建整个 repo 的小罐子)。这确实需要纠正。同时,我正在切换到 gradle...
  • 只要第三方库允许重命名jar就可以了。 SAP 的一些库不允许 maven 使用的重命名。所以我必须继续使用 system 范围的依赖项。
【解决方案2】:

如果偶然由于第三方的一些愚蠢的命名/打包检查而无法将第三方库安装到本地存储库,您仍然可以在构建时将 system 范围依赖项添加到最终包中(至少如果您正在构建一个 web 应用程序)使用 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 的目录来保存这些类型的第3 方库。在构建过程中,它们被放置在正确的目录中并添加到 war 文件中。

【讨论】:

  • 如果我这样做。还需要将库作为依赖项包括在内吗?还是我必须删除 system 依赖项?
  • @elbraulio 我猜你在问是否需要专门为正常依赖项添加包含。标准依赖项(范围内的compile)正常处理,这应该只针对范围内的system
【解决方案3】:

您可以根据需要将战争插件配置为 allsome jar includedexcluded如下所述。简单而有效

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

【讨论】:

    【解决方案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>
    

    【讨论】:

    • 它在哪里说系统依赖项(几个 jars)将进入构建中的 WEB-INF/lib 文件夹。
    • @coding_idiot maven-war-plugin 通过将所有依赖项放在 WEB-INF/lib 文件夹中自动执行此操作
    • 你在哪里指定系统jar?我无法在任何地方看到任何指定的 jar 或 jar 位置。
    • &lt;resource&gt;&lt;directory&gt;lib&lt;/directory&gt; &lt;targetPath&gt;WEB_INF/lib&lt;/targetPath&gt; &lt;includes&gt; &lt;include&gt;**/*.jar&lt;/include&gt; &lt;/includes&gt; &lt;/resource&gt; 此代码不包括我在结果战争中添加的系统依赖项。我还修改了我的问题以指定如何在我的 POM 中包含系统依赖项。
    • 这对我有用。当心:示例代码包括 Java 1.5 版的“maven-compiler-plugin”,我不需要。另外,不是“WEB_INF”而是“WEB-INF”!!!
    【解决方案5】:

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

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

    【讨论】:

    • jdevora 的方法对我不起作用。在使用 mvn 命令行工具构建 WAR 时,我将 .jar 打包到 jdevora 所写的 WEB-INF/lib 中。但是直接从 eclipse 运行 Wildfly 服务器时,eclipse 部署没有使用 pom 复制任务,也没有使用之前编译的 .war。它基于 eclipse 的 maven 依赖项进行部署,因此跳过了这些 JAR。
    【解决方案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 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>
    

    【讨论】:

      【解决方案7】:

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

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

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

      如果使用 eclipse

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多