在我的J2EE项目中,我有几个依赖关系,在任何Maven存储库中都不可用,因为它们是专有库。这些库需要在运行时可用,因此必须将其复制到target /.../ WEB-INF / lib ...
现在,我在POM中将它们列为系统依赖项,但是使用这种方法的问题是,在编译过程中没有将它们复制到目标版本中。而且这种方法也不是很优雅。
那么将它们集成到Maven中的最佳方法是什么?
注意:我不想创建自己的Maven存储库。
在我的J2EE项目中,我有几个依赖关系,在任何Maven存储库中都不可用,因为它们是专有库。这些库需要在运行时可用,因此必须将其复制到target /.../ WEB-INF / lib ...
现在,我在POM中将它们列为系统依赖项,但是使用这种方法的问题是,在编译过程中没有将它们复制到目标版本中。而且这种方法也不是很优雅。
那么将它们集成到Maven中的最佳方法是什么?
注意:我不想创建自己的Maven存储库。
Answers:
如您所说,您不想建立自己的存储库,也许这会有所帮助。
您可以使用maven-install-plugin 的install-file目标将文件安装到本地存储库。如果使用每个文件的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
然后,您可以在项目中照常引用依赖项。
但是,最好的选择还是建立一个内部远程存储库,我建议自己使用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安装到此仓库中:
mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]
最后,将以下回购和依赖项定义添加到项目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>
/
(即表示文件夹)结尾时,将使用groupId创建该仓库。例如:如果组ID是foo.com
并且localRepositoryPath是repo
,则repo文件夹将变为repo.foo.com
。
您需要设置一个本地存储库来托管此类库。有许多项目可以做到这一点。例如Artifactory。
如果您使用的是Jenkins build,则所有解决方案均无效!当pom在Jenkins构建服务器中运行时,这些解决方案将失败,因为Jenkins运行pom将尝试从企业存储库下载这些文件。
将jar复制到src / main / resources / lib(创建lib文件夹)下。这些将成为您项目的一部分,并一直到部署服务器。在Deployment Server中,确保您的启动脚本在类路径中包含src / main / resources / lib / *。中提琴
如果我很了解,如果您想要做的是在编译阶段导出依赖项,从而无需手动检索每个所需的库,则可以使用mojo copy-dependencies。
希望它对您的情况有用(示例)
@Ric Jafe的解决方案对我有用。
这正是我想要的。一种用于研究测试代码的方法。没有什么花哨。是的,我知道那就是他们所说的:)出于我的目的,各种maven插件解决方案似乎都过分了。我有一些罐子作为带有pom文件的第三方库提供给我。我希望它可以快速编译/运行。我平常适应python的解决方案为我带来了奇迹。剪切并粘贴到我的pom中。这个问题的Python / Perl代码在以下问答中:是否可以在不安装jar的情况下将jar添加到maven 2 build classpath?
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依赖项插件将它们复制到target /.../ WEB-INF / lib ...:
http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html