简体   繁体   English

如何在使用maven构建的war中包含系统依赖项

[英]How to include system dependencies in war built using maven

I've searched on internet for quite some time and I'm unable to figure out how to configure the maven-war plugin or something alike so that the system dependencies are included in the built-war (WEB-INF/lib folder) 我已经在互联网上搜索了很长时间,我无法弄清楚如何配置maven-war插件或类似的东西,以便系统依赖项包含在内置战争(WEB-INF / lib文件夹)中

I use the maven dependency plugin in case of a jar-build as : 我在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>

but I'm unable to understand what is to be done in case of a war build. 但是我无法理解在战争构建的情况下要做什么。 I've tried using the maven-war plugin, but it's not including system-dependencies in the build. 我尝试过使用maven-war插件,但它不包括构建中的系统依赖项。

[UPDATE] [UPDATE]

I'm having depedencies of type : 我有类型的依赖:

<dependency>
    <groupId>LoginRadius</groupId>
    <artifactId>LoginRadius</artifactId>
    <scope>system</scope>
    <version>1.0</version>
    <systemPath>${basedir}\lib\LoginRadius-1.0.jar</systemPath>
</dependency>

in my POM and these dependencies are not included in WEB-INF/lib when the war is build. 在我的POM中,当构建war时,这些依赖项不包含在WEB-INF / lib中。

Let me try to summarise the options I tried : 让我试着总结一下我尝试的选项:

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

This doesn't work! 这不起作用! Also, only having the jar name, excludes everything else, so if you are willing to try then try 此外,只有罐子名称,排除其他一切,所以如果你愿意尝试然后尝试

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

Jatin's answer seemed a bit complex and I tried going through the POM again & again to figure out where exactly were the system jars mentioned to be included in WEB-INF POM. Jatin的答案似乎有点复杂,我试图再次通过POM来弄清楚提到的系统罐在WEB-INF POM中的确切位置。

Anyways, I ended up using this solution, which wasn't working at first but after some time and some corrections worked : 无论如何,我最终使用了这个解决方案,这个解决方案最初没有工作,但经过一段时间后,一些修正工作:

I installed the jar in my local repository using the below command : 我使用以下命令在我的本地存储库中安装了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`

After running the above command, I changed the dependency in POM to 运行上面的命令后,我将POM中的依赖项更改为

<dependency>
   <groupId>LoginRadius</groupId>
   <artifactId>LoginRadius</artifactId>
   <!--<scope>system</scope>-->
   <version>1.0</version>
   <!--<systemPath>${basedir}\lib\LoginRadius-1.0.jar</systemPath>-->
</dependency>

NOTE - See I've commented the system scope & systemPath. 注 - 请参阅我已评论系统范围和systemPath。

Building the war now, includes this LoginRadius-1.0.jar in WEB-INF/lib 现在构建战争,在WEB-INF / lib中包含此LoginRadius-1.0.jar

If by chance you can't install the third party library to your local repository, due to some silly naming/packaging checks by the third party, you can still add your system scoped dependencies to your final package at build time (at least if you are building a webapp) using the maven-war-plugin where you would need to create a configuration like this. 如果您不能将第三方库安装到本地存储库,由于第三方进行了一些愚蠢的命名/打包检查,您仍然可以在构建时将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>

Not sure but I believe that the library must be somewhere local to the project's base directory. 不确定,但我相信该库必须位于项目基本目录的本地。 I tend to create a directory under src/main/ called lib to hold these sorts of 3rd party libs. 我倾向于在src/main/ called lib下创建一个目录来保存这些类型的第三方库。 During build process they are placed in the correct directory and added to the war file. 在构建过程中,它们被放置在正确的目录中并添加到war文件中。

If you meant as jar dependencies, then below is a sample pom.xml which takes are needed files and generates a war file: 如果您的意思是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>

Based on your initial POM, I would suggest to send them directly to the WEB-INF/lib directory 根据您的初始POM,我建议将它们直接发送到WEB-INF / lib目录

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

You can configure the war plugin to have all or some jar included or excluded as per your need as mentioned below. 您可以根据需要配置war插件以包含排除 所有某些 jar,如下所述。 Simple & works 简单而有效

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

If all went well, you can find your artifact published inside of 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.

Now, in your pom.xml, declare it in your project a Maven repository. 现在,在您的pom.xml中,在项目中将其声明为Maven存储库。

<repositories>
    <repository>
        <id>local-repo</id>
        <url>file://${basedir}/lib</url>
    </repository>
</repositories>

And lastly, in your pom.xml declare a dependency on the local .jar like you would for any dependency. 最后,在你的pom.xml中声明对本地.jar的依赖,就像你对任何依赖一样。

<dependencies>
    <dependency>
        <groupId>com.hp.medici</groupId>
        <artifactId>medici</artifactId>
        <version>1.0.1</version>
    </dependency>
</dependencies>

It may be problem of the scope where the dependencies are defined: 可能是定义依赖关系的范围的问题:

  • compile : Dependencies in "compile" scope will automatically be copied to the target's WEB-INF/lib as part of the Maven build. 编译 :“编译”范围中的依赖关系将自动复制到目标的WEB-INF / lib,作为Maven构建的一部分。
  • provided : Dependencies in "provided" scope will not be copied (you would use this for server-supplied jars such as the JSP-api.jar). 提供 :不会复制“提供”范围中的依赖关系(您可以将其用于服务器提供的jar,例如JSP-api.jar)。

To generate a WAR in Maven, 2 goals have to be run: "compile" and "war:war". 要在Maven中生成WAR,必须运行2个目标:“compile”和“war:war”。 Running the war goal alone won't compile the Java source . 单独运行war目标将无法编译Java源代码。 If you prefer, run one of the master goals, such as "package". 如果您愿意,可以运行其中一个主目标,例如“package”。

If using eclipse : 如果使用eclipse

select the POM in the project explorer and select the "Run" context menu option. 在项目资源管理器中选择POM,然后选择“运行”上下文菜单选项。 This will build and execute Maven run profile (or use an existing one). 这将构建并执行Maven运行配置文件(或使用现有配置文件)。 Maven run profiles behave just like regular run/debug profiles except that their profile edit dialogs support Maven-specific features. Maven运行配置文件的行为与常规运行/调试配置文件类似,只是它们的配置文件编辑对话框支持Maven特定功能。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM