在我的 J2EE 项目中,我有几个依赖项,它们在任何 Maven 存储库中都不可用,因为它们是专有库。这些库需要在运行时可用,因此必须复制到 target/.../WEB-INF/lib ...
现在,我在我的 POM 中将它们列为系统依赖项,但是使用这种方法的问题是,在编译期间它们没有被复制到目标构建中。这种方法也不是很优雅。
那么将它们集成到 Maven 中的最佳方式是什么?
注意:我不想创建自己的 Maven 存储库。
对于想要快速解决此问题的人:
<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 和工件名称,并指向它在文件系统中的位置。你已准备好出发。
当然,这是一个肮脏的快速修复,只能在您的机器上运行,并且如果您不更改库的路径。但有时,这就是你想要的,运行并做一些测试。
编辑:只是重新提出问题并意识到用户已经在使用我的解决方案作为临时修复。我会留下我的答案,作为对这个问题的其他人的快速帮助。如果有人不同意这一点,请给我留言。 :)
正如您所说,您不想建立自己的存储库,也许这会有所帮助。
您可以使用 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
然后,您可以在项目中正常引用依赖项。
但是,最好的办法仍然是建立一个内部远程存储库,我建议自己使用 Nexus。如果需要,它可以在您的开发盒上运行,而且开销很小。
在您的项目下创建一个存储库文件夹。让我们来
${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>
/
结尾(即表示文件夹)时,则使用 groupId 创建 repo。例如:如果组 id 为 foo.com
并且 localRepositoryPath 为 repo
,则 repo 文件夹变为 repo.foo.com
。
如果您使用 Jenkins 构建,所有解决方案都不起作用!!当 pom 在 Jenkins 构建服务器中运行时,这些解决方案将失败,因为 Jenkins 运行 pom 将尝试从企业存储库下载这些文件。
复制 src/main/resources/lib 下的 jars(创建 lib 文件夹)。这些将成为您项目的一部分,并一直到部署服务器。在部署服务器中,确保您的启动脚本在类路径中包含 src/main/resources/lib/*。中提琴。
您可以将它们安装在私有的本地存储库中(例如,您的主目录下的 .m2/repository):more details here
@Ric Jafe 的解决方案对我有用。
这正是我一直在寻找的。一种将其推向研究测试代码的方法。没有什么花哨。是的,我知道他们都是这么说的 :) 各种 Maven 插件解决方案对于我的目的来说似乎是矫枉过正。我有一些罐子作为带有 pom 文件的 3rd 方库提供给我。我希望它能够快速编译/运行。这个我很容易适应 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 依赖插件将它们复制到 target/.../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