问题

在实验/快速和肮脏的模拟开发阶段,Maven2让我发疯。

我有一个pom.xml文件,它定义了我想要使用的web-app框架的依赖项,我可以从该文件快速生成启动项目。但是,有时我想链接到尚未定义pom.xml文件的第三方库,而不是手动创建第三方lib的pom.xml文件并安装它,并且将依赖项添加到我的pom.xml中,我只想告诉Maven:“除了我定义的依赖项之外,还要包含/ lib中的任何jar。”

看起来这应该很简单,但如果是这样,我就会遗漏一些东西。

任何关于如何做到这一点的指针都非常感谢。除此之外,如果有一种简单的方法将maven指向/ lib目录并轻松创建一个pom.xml,其中所有封闭的jar都映射到单个依赖项,然后我可以命名/安装并链接到一举也足够了。


#1 热门回答(556 赞)

#流行方法的问题

你将在互联网上找到的大多数答案都建议你将依赖项安装到本地存储库,或者在“pom”中指定“系统”范围,并将依赖项分配给项目源。但这两种解决方案实际上都存在缺陷。

##为什么不应用“安装到本地回购”方法

当你将依赖项安装到本地存储库时,它仍然存在。只要它可以访问此存储库,你的分发工件就可以正常工作。问题是在大多数情况下,此存储库将驻留在你的本地计算机上,因此无法在任何其他计算机上解决此依赖关系。显然,使你的工件依赖于特定的机器并不是处理事情的方法。否则,必须在使用该项目的每台计算机上本地安装此依赖项,这不是更好。

##为什么不应用“系统范围”方法

你依赖“系统范围”方法的罐子既不会安装到任何存储库,也不会连接到目标软件包。这就是为什么你的分发包在使用时无法解决该依赖关系的原因。我认为这就是为什么系统范围的使用甚至被弃用的原因。无论如何,你不希望依赖已弃用的功能。

#静态项目内存储库解决方案

把它放在你的pom之后:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

对于具有形式为“x.y.z”的组ID的每个工件,Maven将在项目目录中包含以下位置以搜索工件:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

要详细说明,请阅读this blog post

##使用Maven安装到项目仓库

我建议使用Maven插件将jar作为工件安装,而不是手动创建此结构。因此,要将工件安装到repo文件夹下的项目内存储库,请执行:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

如果你选择这种方法,你将能够将pom中的存储库声明简化为:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

##一个帮助脚本

由于为每个lib执行安装命令有点烦人并且肯定容易出错,我创建了一个utility script,它自动将所有jar从lib文件夹安装到项目存储库,同时自动解析所有元数据(groupId,artifactId等)文件名。该脚本还打印出依赖项xml,供你在pom中复制粘贴。

##在目标包中包含依赖项

当你创建项目中的存储库时,你将解决使用其源分发项目依赖项的问题,但从那时起,项目的目标工件将依赖于未发布的jar,因此当你安装时它到存储库它将具有无法解析的依赖关系。

为了解决这个问题,我建议在目标包中包含这些依赖项。这可以用Assembly Plugin或更好的与OneJar Plugin。关于OneJar的官方文档很容易理解。


#2 热门回答(459 赞)

抛弃码仅
set scope == system,只需组成groupId,artifactId和version

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

注意:系统依赖关系不会复制到生成的jar / war中
(seeHow to include system dependencies in war built using maven)


#3 热门回答(49 赞)

你可以在项目中创建本地存储库

例如,如果项目结构中有libs文件夹

  • 在libs文件夹中,你应该创建目录结构,如:/groupId/artifactId/version/artifactId-version.jar
  • 在你的pom.xml中,你应该注册repository <repository>
        <ID> ProjectRepo </ ID>
        <名称> ProjectRepo </名称>
        <URL>文件:// $ /库</ URL>
    </存储库>
  • 并像往常一样添加依赖<dependency>
        <的groupId>的groupId </的groupId>
        <artifactId的>的artifactId </ artifactId的>
        <版本>版本</版本>
    </依赖性>

就这些。

详细信息:How to add external libraries in Maven


原文链接