java - 我可以添加jar导入到maven 2构建类路径而不安装它们?

  显示原文与译文双语对照的内容

Maven2在开发/快速和肮脏的mock-up阶段使我发疯。

我有一个 pom.xml 文件,定义了我想使用的web-app框架的依赖关系,并且我可以从那个文件快速生成起始项目。 然而,有时我想链接到一个 3rd方库不已经有一个 pom.xml 文件定义,因此而不是创建的pom.xml 文件 3rd党自由手工和安装它,并添加依赖 pom.xml, 我只想告诉 Maven: "除了我定义的依赖项,还包括 /lib 中的任何 jar 。"

这看起来应该是简单的,但如果是的话,我将丢失一些东西。

关于如何做到这一点的任何指针都非常有用。 ,如果有一个简单的方法来指向 Maven的/lib 目录并轻松创建一个 pom.xml,它映射到一个依赖关系,并将它的映射到一个依赖关系,这个依赖关系也可以在一个瞬间进行。

时间:

流行方法的问题

大部分的答案你会发现在互联网将建议你安装的依赖你的本地存储库或指定一个"系统" pom 范围,分配项目的依赖与源。 但这两个解决方案实际上都有缺陷。

为什么不应用"安装到本地仓库"方法

当你安装到本地存储库的依赖关系时,它仍然存在。 你的发行版工件只要有访问这个存储库的权限就可以完成。 问题是在大多数情况下这个存储库将驻留在你的本地机器上,所以没有办法在任何其他机器上解决这个依赖。 显然,让你的工件依赖于特定的机器不是处理事情的一种方法。 否则,这里依赖关系必须在所有与该项目一起工作的机器上被本地安装,这不是更好的。

为什么不应用"系统作用域"方法

使用"系统作用域"方法所依赖的jar都不会被安装到任何存储库或者附加到目标软件包。 这就是你的发行版包在使用时无法解析该依赖关系的原因。 我相信这就是为什么使用系统作用域甚至被否决的原因。 无论如何,你不想依赖一个过时的特性。

静态in-project知识库解决方案

将这个放入你的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 Maven 组标识的工件,在它的搜索工件的项目目录中将包含以下位置:


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

为了更详细地阐述这一点,你可以阅读这篇博文。

使用 Maven 安装到项目仓库

我建议使用 Maven 插件来安装你的jar,而不是手工创建这个结构。 因此,安装工件in-project库 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>

helper 脚本

自执行安装命令对每个自由肯定是有点恼人的和容易出错,我已经创建了一个实用程序自动安装的脚本lib 文件夹的所有jar项目存储库,而自动解决所有元数据( groupId,artifactId和 等等 ) 从文件的名称。 脚本还打印出依赖xml copy-paste pom

在目标包中包含依赖项

When you will have your in-project repository created you will have solved a problem of distributing dependencies of project with its source, but since then your target of project an artifact will depend on non-published jars, so When you will install it to a repository it will have unresolvable dependencies.

为了解决这个问题,我建议在你的目标包中包括这些依赖。 你可以使用汇编插件,或者使用 OneJar插件。 documentaion上的官方很容易掌握。

只有扔掉代码

设置作用域==系统并只组成一个 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>

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

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

  • libs 文件夹中,你应该创建如下目录结构: /groupId/artifactId/version/artifactId-verion.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 中添加外部库

这就是我所做的,它也能解决包问题,它可以与签出代码一起工作。

我在项目中创建了一个新文件夹,在我的案例中我使用了 repo,但可以自由使用 src/repo

在我的POM中,我有一个不在任何公共 Maven 知识库中的依赖


<dependency>
 <groupId>com.dovetail</groupId>
 <artifactId>zoslog4j</artifactId>
 <version>1.0.1</version>
 <scope>runtime</scope>
</dependency>

然后我创建了以下目录 repo/com/dovetail/zoslog4j/1.0.1 并将JAR文件复制到那个文件夹。

我创建了以下POM文件来代表下载的文件( 这里步骤是可选的,但它删除了一个警告),并帮助下一个人找出我从哪里开始的文件。


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.dovetail</groupId>
 <artifactId>zoslog4j</artifactId>
 <packaging>jar</packaging>
 <version>1.0.1</version>
 <name>z/OS Log4J Appenders</name>
 <url>http://dovetail.com/downloads/misc/index.html</url>
 <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

我创建的两个可选文件是POM和JAR的SHA1校验和,用于删除丢失的校验和警告。


shasum -b <repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar 
> repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b <repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom 
> repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

最后,我将以下Fragment添加到我的pom.xml 中,它允许我引用本地存储库


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

这就是我们添加或者安装本地jar的方式


 <dependency>
 <groupId>org.example</groupId>
 <artifactId>iamajar</artifactId>
 <version>1.0</version>
 <scope>system</scope>
 <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
 </dependency>

我给出了一些默认的groupId和 artifactId,因为它们是必需的:)

使用 <scope>system</scope> 是一个可怕的想法的原因解释为他人,手动安装文件到你的本地存储库使构建unreproducible,和使用 <url>file://${project.basedir}/repo</url> 这不是一个好主意,因为( 1 ) 可能不是 well-formed file URL ( 例如。 如果项目签出目录中不寻常的字符),( 2 ) 结果是无法使用,如果项目的pom作为依赖的人其他的项目。

假设你不愿将工件上传到公共库,建议 Simeon helper 模块的工作。 但现在还有更简单的方法。。

建议

使用 non-maven-jar-maven-plugin。你是什么要求,与其他方法的缺点。

我找到了另一种方法,从 Heroku文章中看到

总结( 抱歉,有些复制&粘贴)

  • 在根文件夹下创建一个 repo 目录:
yourproject
+- pom.xml
+- src
+- repo
  • 运行这里命令将jar安装到本地仓库目录
mvn deploy:deploy-file -Durl=file:///path/to/yourproject/repo/-Dfile=mylib-1.0.jar -DgroupId=com.example -DartifactId=mylib -Dpackaging=jar -Dversion=1.0
  • 添加你的pom.xml:

<repositories>
 <!--other repositories if any-->
 <repository>
 <id>project.local</id>
 <name>project</name>
 <url>file:${project.basedir}/repo</url>
 </repository>
</repositories>


<dependency>
 <groupId>com.example</groupId>
 <artifactId>mylib</artifactId>
 <version>1.0</version> 
</dependency>

...