在试验 / 快速而肮脏的开发阶段中,Maven2 使我发疯。
我有一个pom.xml
文件,该文件定义了要使用的 Web 应用程序框架的依赖关系,并且可以从该文件快速生成启动程序项目。但是,有时我想链接到尚未pom.xml
文件的第三方库,因此,不是pom.xml
文件并进行安装,然后将依赖项添加到我的pom.xml
,我想告诉 Maven:“除了定义的依赖项之外,还包括/lib
所有 jar。”
看起来这应该很简单,但是如果是这样,我就缺少了一些东西。
任何有关如何执行此操作的指针将不胜感激。简而言之,如果有一种简单的方法将 maven 指向/lib
目录并轻松创建pom.xml
并将所有封闭的 jar 映射到单个依赖项,然后我可以命名 / 安装并链接到一个依赖项中,也足够了。
您将在 Internet 上找到的大多数答案都建议您将依赖项安装到本地存储库,或者在pom
指定 “系统” 范围,然后将依赖项与项目源一起分发。但是,这两种解决方案实际上都是有缺陷的。
当您将依赖项安装到本地存储库时,它将保留在那里。只要您可以访问此存储库,您的分发工件就可以正常工作。问题是在大多数情况下,该存储库将驻留在您的本地计算机上,因此将无法解决对任何其他计算机的依赖性。显然,使您的工件依赖于特定的机器不是处理事情的方法。否则,必须将此依赖项本地安装在与该项目一起工作的每台计算机上,这并没有更好的效果。
您使用 “系统范围” 方法所依赖的 jar 既不会安装到任何存储库中,也不会被附加到您的目标软件包中。这就是为什么您的分发包在使用时将无法解决该依赖关系的原因。我认为这是什至不赞成使用系统范围的原因。无论如何,您都不想依赖不推荐使用的功能。
将其放入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>
对于每个组 ID 为xyz
形式的工件,Maven 在搜索工件时将在项目目录中包含以下位置:
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
要对此进行详细说明,可以阅读此博客文章。
我建议不要使用手动创建此结构,而是使用 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>
由于对每个库执行安装命令有点烦人并且肯定容易出错,因此我创建了一个实用程序脚本,该脚本会自动将所有 jar 从lib
文件夹安装到项目存储库,同时自动解析所有元数据(groupId,artifactId 等)。来自文件名。该脚本还打印出依赖项 xml,供您复制粘贴到pom
。
创建项目内存储库后,将解决分配项目依赖项及其源的问题,但是从那时起,项目的目标工件将依赖于未发布的 jar,因此在安装时它到一个存储库中,它将具有无法解决的依赖关系。
为了解决这个问题,我建议在您的目标软件包中包括这些依赖项。您可以使用Assembly 插件,也可以使用OneJar 插件更好地做到这一点。 OneJar 上的官方文档很容易掌握。
仅适用于丢弃代码
设置 scope == system 并仅组成一个 groupId,artifactId 和版本
<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 中
(请参阅如何在使用 maven 构建的战争中包括系统依赖项)
您可以在项目上创建本地存储库
例如,如果项目结构中libs
在libs
文件夹中,您应该创建目录结构,例如: /groupId/artifactId/version/artifactId-version.jar
在 pom.xml 中,您应该注册存储库
<repository>
<id>ProjectRepo</id>
<name>ProjectRepo</name>
<url>file://${project.basedir}/libs</url>
</repository>
并像往常一样添加依赖项
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
</dependency>
就这些。
有关详细信息:如何在 Maven 中添加外部库