Java Maven:在项目版本控制中保留依赖JAR
因此,我有一个war项目,其中包含几个在任何存储库中都不可用的依赖JAR。直到最近,我一直将它们保存在Java Maven:在项目版本控制中保留依赖JAR,java,maven,Java,Maven,因此,我有一个war项目,其中包含几个在任何存储库中都不可用的依赖JAR。直到最近,我一直将它们保存在src/main/webapp/WEB-INF/lib中,并使用将它们添加到pom中 我明白这是有问题的,所以我希望清理我的构建。我已经通过install:install file插件将JAR半手动安装到我的.m2/存储库中。这对我来说太好了,但是我团队中的其他人呢?我们很小,建立Nexus并不是我们的选择。我已经求助于向pom.xml添加注释,解释如何为每个jar运行install:insta
src/main/webapp/WEB-INF/lib
中,并使用将它们添加到pom中
我明白这是有问题的,所以我希望清理我的构建。我已经通过install:install file
插件将JAR半手动安装到我的.m2/存储库中。这对我来说太好了,但是我团队中的其他人呢?我们很小,建立Nexus并不是我们的选择。我已经求助于向pom.xml
添加注释,解释如何为每个jar运行install:install文件
我可以使用install:install file
解决方案,但我仍然希望在项目的版本控制中包含这些工件,而不仅仅是将它们散布在我的文件系统中
将它们保存在src/main/webapp/WEB-INF/lib中是行不通的,因为这样会自动将它们添加到生成的war工件中(离题:如果maven只需继续并将它们添加到类路径中,我就可以完成了,不需要安装:安装文件!)
问题:在maven目录布局中是否有一个经批准的位置,我可以将这些.jar
文件塞入其中,以便将它们作为项目的一部分保存
我确实意识到这里发生了什么——Maven正试图将依赖JAR保留在我的构建之外,以便当其他项目依赖于我的构建时,它们可以解决可传递的依赖关系。这对于公开的maven回购协议中的开源项目来说是非常好的,但我敢打赌,绝大多数使用maven的人都在从事这样的“leaf”项目,如果有一种方法可以将jar文件作为项目的一部分,而不必经历太多的麻烦,那将非常方便。我认为在您的情况下,最好的解决方案是设置一个内部存储库。没有必要首先设置整个Nexus。任何简单的Web服务器都足够了,或者在某个地方共享文件夹
查看如何设置内部存储库。如果按照Jan的建议设置Nexus或只是一个简单的文件服务器repo真的太麻烦了,下面是一些其他选项:
- 只需包含jar和一个脚本,将它们全部安装在版本控制中选择的目录中。不需要Maven结构来批准它
- 将版本控制系统用作存储库的主机,可以在主项目的分支上单独使用,也可以作为单独的项目使用。让您在版本控制上已经拥有的任何备份、安全性等应用于存储库,而不将JAR包含在实际签出和提交的文件集中
- 将jar包含在一个文件夹中,该文件夹充当一个迷你存储库,与其余代码一起签出。让pom.xml指向该文件夹作为它使用的存储库。我不是100%确定这是可能的,但似乎是可能的
在我们使用的公司,它是迄今为止设置和维护最简单的存储库管理器。特别是如果您使用基于单机的版本。每个开发人员只需在他们的~/.m2/settings.xml
文件中设置一个概要文件
,以指向内部存储库。如果这太麻烦了,只需将内部存储库直接放在pom.xml
的
中,但这是一种非常糟糕的做法。如果存储库url发生移动,则必须更新所有项目pom.xml
文件。使用settings.xml
会给开发人员带来更新本地配置的负担
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>internal</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>mycompany.internal</id>
<name>Internal Release Repository</name>
<url>http://maven.mycompany.com/repository/internal/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>mycompany.snapshots</id>
<name>Internal Snapshot Repository</name>
<url>http://maven.mycompany.com/repository/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<servers>
<server>
<id>internal</id>
<username>guest</username>
</server>
<server>
<id>snapshots</id>
<username>guest</username>
</server>
</servers>
</settings>
然后您所要做的就是mvn clean release:prepare
自动更新您的pom.xml
版本签入,标记,以及可选的分支发布并打包所有工件,然后mvn发布:执行
将工件推送到远程存储库,签入新版本的pom.xml
,您就可以开始下一个版本的开发了
快照进入snaphots
,释放插件自动进入internal
。您也必须配置scm插件,但这只是几行配置,您只需触摸一次即可
这就是git的外观,我们使用Gitorious作为git存储库管理器
<scm>
<connection>scm:git:git://gitorious.mycompany.com:myproject/myproject.git</connection>
<developerConnection>scm:git:ssh://git@gitorious.mycompany.com/myproject/myproject.git</developerConnection>
<url>http://gitorious.mycompany.com/myproject/myproject</url>
</scm>
scm:git:git://gitorious.mycompany.com:myproject/myproject.git
scm:git:ssh://git@gitorious.mycompany.com/myproject/myproject.git
http://gitorious.mycompany.com/myproject/myproject
运行Linux的旧台式计算机可以为开发团队处理这样的存储库任务,而无需涉及采购和IT。我在现实生活中没有使用过这一功能,但它似乎起到了作用:只需在源代码树中粘贴一个存储库布局(我想使用install:install file)并将其签入即可。使用条目指向该回购协议。像这样的pom:
<?xml version="1.0" encoding="utf-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<name>Depending project</name>
<groupId>com.example</groupId>
<artifactId>dependent</artifactId>
<version>0.9</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dependency</artifactId>
<version>0.9.3</version>
<type>jar</type>
</dependency>
</dependencies>
<repositories>
<repository>
<id>project-specific-deps</id>
<name>project-specific-deps</name>
<url>file:///${basedir}/repo</url>
</repository>
</repositories>
</project>
听起来怎么样
完整性:
$ mvn -version
Apache Maven 2.2.1 (rdebian-4)
Java version: 1.6.0_20
Java home: /usr/lib/jvm/java-6-sun-1.6.0.20/jre
Default locale: sv_SE, platform encoding: ISO-8859-1
OS name: "linux" version: "2.6.32-3-686" arch: "i386" Family: "unix"
这里已经有很多很好的答案,你应该强烈考虑为你的团队建立一个存储库管理器,比如AGIVA,因为它现在和以后都会提供其他的好处。
但是,为了直接回答您的问题,这里有一种使用Maven在版本控制中存储依赖项的模式:
请记住,它将项目限制为独立使用-如果您开始希望将其作为其他Maven项目的依赖项共享,您仍然需要设置存储库。设置Nexus非常简单。我在家里有一个只为我自己运行的实例。用nexus创建本地存储库会不会太过分?你可以用它来代理所有maven回购协议并保留那些第三方JAR。当然,
.
|-- pom.xml
|-- repo
| `-- com
| `-- example
| `--dependency
| |-- 0.9.3
| | |-- dependency-0.9.3.jar
| | |-- dependency-0.9.3.jar.md5
| | |-- dependency-0.9.3.jar.sha1
| | |-- dependency-0.9.3.pom
| | |-- dependency-0.9.3.pom.md5
| | `-- dependency-0.9.3.pom.sha1
| |-- maven-metadata.xml
| |-- maven-metadata.xml.md5
| `-- maven-metadata.xml.sha1
|-- src
| `-- main
| `-- java
| `-- com
| `-- example
| `-- dependent
| `-- Foobar.java
$ mvn -version
Apache Maven 2.2.1 (rdebian-4)
Java version: 1.6.0_20
Java home: /usr/lib/jvm/java-6-sun-1.6.0.20/jre
Default locale: sv_SE, platform encoding: ISO-8859-1
OS name: "linux" version: "2.6.32-3-686" arch: "i386" Family: "unix"