Java Maven:在项目版本控制中保留依赖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

因此,我有一个war项目,其中包含几个在任何存储库中都不可用的依赖JAR。直到最近,我一直将它们保存在
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"