我已经在Stack Overflow上找到了如何在项目中包含第三方JAR而不将其安装到“本地存储库”的答案:
Can I add jars to maven 2 build classpath without installing them?
但是,当我使用Maven Shade插件创建一个包含项目所有依赖项的JAR时,第三方JAR不会自动包含。
如何让Maven Shade插件将这样的第三方JAR添加到着色的JAR中?
根据得到的答案,我让它成功了。我做的是,将这个片段添加到我的pom.xml的开头:
<repositories>
<repository>
<id>repo</id>
<url>file://${basedir}/repo</url>
</repository>
</repositories>
然后为我的项目添加了依赖项,也添加到pom.xml:
<dependencies>
<dependency>
<groupId>dummy</groupId>
<artifactId>dummy</artifactId>
<version>0.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
然后运行命令行将包添加到'repo':
mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file
-Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy
-Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/
(不确定repo路径是否需要完整路径,但不想冒险。)
repo子目录的内容现在是:
repo/dummy/dummy/0.0.0/dummy-0.0.0.jar
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom
repo/dummy/dummy/maven-metadata-local.xml
现在我可以将其检入版本控制,并且没有本地或远程依赖项。
答案 0 :(得分:40)
但是,当我使用Maven Shade插件创建一个包含项目所有依赖项的JAR时,第三方JAR不会自动包含。
是的,因为假定system
范围内的依赖关系始终存在(这正是system
范围的内容),因此不会包含它们。人们实际上不明白system
范围依赖是什么,他们只是继续滥用它们(是的,这是滥用),然后得到副作用并想知道为什么(正如Brian在他的answer中指出的那样)
我已在SO上写过many,many,really many次,在99%的情况下,system
范围内的依赖关系应该要避免。我将重复Dependency Scopes迷你指南再说一遍的内容:
system
:在项目生命周期的某个阶段需要此依赖项,但这是系统特定的。 不鼓励使用此范围:这被认为是一种“高级”功能,只有在您真正了解其使用的所有后果时才能使用,如果实际上无法量化则可能非常困难。根据定义,此范围使您的构建不可移植。在某些边缘情况下可能是必要的。系统范围包括<systemPath>
元素,该元素指向此依赖关系在本地计算机上的物理位置。因此,它用于指代预期存在于给定本地机器上而不是存储库中的某个工件;并且其路径可能因机器而异。 systemPath元素可以在其路径中引用环境变量:例如${JAVA_HOME}
。
因此,不是使用system
范围,而是:
install:install-file
将您的库添加到本地存储库。这是一种快速而肮脏的方式来使事情正常工作,如果你是一个人,它可能是一个选项,但它使你的构建不可移植。 deploy:deploy-file
添加您的库。这是理想方案。请停止使用system
范围。
答案 1 :(得分:13)
Maven addjars插件解决了这个问题 - 请参阅
http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage
答案 2 :(得分:1)
已使用&lt;资源&gt;把我的lib包含在所有的罐子里。即:
<build>
<resources>
<resource>
<directory>${project.basedir}</directory>
<includes>
<include>lib/*.jar</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
答案 3 :(得分:0)
如果您只需要一个快速而肮脏的解决方案,您可以将提取的 jar 文件的内容添加到您的 src/main/resource 目录中。