在我的J2EE项目中,我有几个依赖项,这些依赖项在任何Maven存储库中都不可用,因为它们是专有库 . 这些库需要在运行时可用,因此必须复制到目标/.../ WEB-INF / lib ...
现在,我将它们列为我的POM中的系统依赖项,但是使用此方法的问题是,在编译期间没有将其复制到目标构建 . 这种方法也不是很优雅 .
那么将它们集成到Maven中的最佳方法是什么?
注意:我不想创建自己的Maven存储库 .
正如您所说,您不想设置自己的存储库,也许这会有所帮助 .
您可以使用maven-install-plugin的install-file goal将文件安装到本地存储库 . 如果您为每个文件创建一个带有Maven调用的脚本并将其与jar放在一起,那么您(以及其他任何有访问权限的人)可以轻松地将jar(和相关的pom文件)安装到其本地存储库中 .
例如:
mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom
要不就
mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar
然后,您可以在项目中正常引用依赖项 .
不过你最好还是 Build 一个内部远程存储库,我建议自己使用Nexus . 如果需要,它可以在您的开发盒上运行,并且开销很小 .
对于想要快速解决此问题的人:
<dependency> <groupId>LIB_NAME</groupId> <artifactId>LIB_NAME</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath> </dependency>
只需为您的库提供唯一的groupID和工件名称,并指向它在文件系统中的位置 . 你已准备好出发 .
当然,这是一个脏的快速修复程序,只能在您的计算机上运行,如果您不更改libs的路径 . 但有时候,这就是你想要的,跑步和做一些测试 .
编辑:重新解决问题并意识到用户已经在使用我的解决方案作为临时修复 . 我会把答案作为对这个问题的其他人的快速帮助 . 如果有人不同意这一点,请给我留言 . :)
在项目下创建一个存储库文件夹 . 让我们来
${project.basedir}/src/main/resources/repo
然后,将自定义jar安装到此repo:
mvn install:install-file -Dfile=[FILE_PATH] \ -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ -Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]
最后,将以下repo和依赖项定义添加到项目pom.xml中:
<repositories> <repository> <id>project-repo</id> <url>file://${project.basedir}/src/main/resources/repo</url> </repository> </repositories> <dependencies> <dependency> <groupId>[GROUP]</groupId> <artifactId>[ARTIFACT]</artifactId> <version>[VERS]</version> </dependency> </dependencies>
您需要设置一个托管此类库的本地存储库 . 有许多项目正是如此 . 例如Artifactory .
如果您使用Jenkins构建,这些解决方案都不起作用!!当pom在Jenkins构建服务器中运行时......这些解决方案将失败,因为Jenkins运行pom将尝试从企业存储库下载这些文件 .
复制src / main / resources / lib下的jar(创建lib文件夹) . 这些将成为您项目的一部分,并一直到部署服务器 . 在部署服务器中,确保您的启动脚本在类路径中包含src / main / resources / lib / * . 中提琴 .
您可以将它们安装在私有的本地存储库中(例如,主目录下的.m2 / repository):more details here
如果我理解得很好,如果您想要做的是在编译阶段导出依赖项,这样就不需要手动检索每个需要的库,您可以使用mojo copy-dependencies .
希望它对你的情况有用(examples)
继续使用它们作为系统依赖项,并使用Maven依赖插件将它们复制到目标/.../ WEB-INF / lib ...:
http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html
单独安装对我不起作用 .
mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \ -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \ -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
@Ric Jafe的解决方案对我有用 .
这正是我所寻找的 . 一种推动研究测试代码的方法 . 没有什么花哨 . 是的我知道这就是他们所说的:)各种maven插件解决方案似乎对我的目的来说太过分了 . 我有一些 jar 作为带有pom文件的第三方库提供给我 . 我希望它能够快速编译/运行 . 这个我很容易适应python的解决方案为我创造了奇迹 . 剪切并粘贴到我的pom中 . 此任务的Python / Perl代码在此问答中:Can I add jars to maven 2 build classpath without installing them?
def AddJars(jarList): s1 = '' for elem in jarList: s1+= """ <dependency> <groupId>local.dummy</groupId> <artifactId>%s</artifactId> <version>0.0.1</version> <scope>system</scope> <systemPath>${project.basedir}/manual_jars/%s</systemPath> </dependency>\n"""%(elem, elem) return s1
您可以尝试使用maven-external-dependency-plugin,它显示了将外部jar添加到任何Maven项目的好方法 .
https://code.google.com/p/maven-external-dependency-plugin/
11 回答
正如您所说,您不想设置自己的存储库,也许这会有所帮助 .
您可以使用maven-install-plugin的install-file goal将文件安装到本地存储库 . 如果您为每个文件创建一个带有Maven调用的脚本并将其与jar放在一起,那么您(以及其他任何有访问权限的人)可以轻松地将jar(和相关的pom文件)安装到其本地存储库中 .
例如:
要不就
然后,您可以在项目中正常引用依赖项 .
不过你最好还是 Build 一个内部远程存储库,我建议自己使用Nexus . 如果需要,它可以在您的开发盒上运行,并且开销很小 .
对于想要快速解决此问题的人:
只需为您的库提供唯一的groupID和工件名称,并指向它在文件系统中的位置 . 你已准备好出发 .
当然,这是一个脏的快速修复程序,只能在您的计算机上运行,如果您不更改libs的路径 . 但有时候,这就是你想要的,跑步和做一些测试 .
编辑:重新解决问题并意识到用户已经在使用我的解决方案作为临时修复 . 我会把答案作为对这个问题的其他人的快速帮助 . 如果有人不同意这一点,请给我留言 . :)
在项目下创建一个存储库文件夹 . 让我们来
然后,将自定义jar安装到此repo:
最后,将以下repo和依赖项定义添加到项目pom.xml中:
您需要设置一个托管此类库的本地存储库 . 有许多项目正是如此 . 例如Artifactory .
如果您使用Jenkins构建,这些解决方案都不起作用!!当pom在Jenkins构建服务器中运行时......这些解决方案将失败,因为Jenkins运行pom将尝试从企业存储库下载这些文件 .
复制src / main / resources / lib下的jar(创建lib文件夹) . 这些将成为您项目的一部分,并一直到部署服务器 . 在部署服务器中,确保您的启动脚本在类路径中包含src / main / resources / lib / * . 中提琴 .
您可以将它们安装在私有的本地存储库中(例如,主目录下的.m2 / repository):more details here
如果我理解得很好,如果您想要做的是在编译阶段导出依赖项,这样就不需要手动检索每个需要的库,您可以使用mojo copy-dependencies .
希望它对你的情况有用(examples)
继续使用它们作为系统依赖项,并使用Maven依赖插件将它们复制到目标/.../ WEB-INF / lib ...:
http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html
单独安装对我不起作用 .
@Ric Jafe的解决方案对我有用 .
这正是我所寻找的 . 一种推动研究测试代码的方法 . 没有什么花哨 . 是的我知道这就是他们所说的:)各种maven插件解决方案似乎对我的目的来说太过分了 . 我有一些 jar 作为带有pom文件的第三方库提供给我 . 我希望它能够快速编译/运行 . 这个我很容易适应python的解决方案为我创造了奇迹 . 剪切并粘贴到我的pom中 . 此任务的Python / Perl代码在此问答中:Can I add jars to maven 2 build classpath without installing them?
您可以尝试使用maven-external-dependency-plugin,它显示了将外部jar添加到任何Maven项目的好方法 .
https://code.google.com/p/maven-external-dependency-plugin/