Reputation: 13734
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)
I use the maven dependency plugin in case of a jar-build as :
<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.
[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.
Upvotes: 46
Views: 78707
Reputation: 13734
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.
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 :
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
<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.
Building the war now, includes this LoginRadius-1.0.jar in WEB-INF/lib
Upvotes: 28
Reputation: 2820
You can configure the war plugin to have all or some jar included or excluded as per your need as mentioned below. 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>
Upvotes: 8
Reputation: 4382
It may be problem of the scope where the dependencies are defined:
To generate a WAR in Maven, 2 goals have to be run: "compile" and "war:war". Running the war goal alone won't compile the Java source . If you prefer, run one of the master goals, such as "package".
If using eclipse:
select the POM in the project explorer and select the "Run" context menu option. This will build and execute Maven run profile (or use an existing one). Maven run profiles behave just like regular run/debug profiles except that their profile edit dialogs support Maven-specific features.
source: https://coderanch.com/t/594897/ide/include-maven-dependencies-war-file
Upvotes: 0
Reputation: 2204
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.
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.
<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.
<dependencies>
<dependency>
<groupId>com.hp.medici</groupId>
<artifactId>medici</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
Upvotes: 0
Reputation: 1256
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.
<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. During build process they are placed in the correct directory and added to the war file.
Upvotes: 23
Reputation: 325
Based on your initial POM, I would suggest to send them directly to the WEB-INF/lib directory
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/lib</outputDirectory>
</configuration>
Upvotes: 3
Reputation: 31754
If you meant as jar dependencies, then below is a sample pom.xml which takes are needed files and generates a war file:
<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>
Upvotes: 4