Maven:在项目版本控制中保持依赖的jar

时间:2011-03-14 16:00:54

标签: java maven

所以,我有一个带有几个依赖jar的war项目,这些jar在任何存储库中都不可用。直到最近,我一直将它们保存在src/main/webapp/WEB-INF/lib中,并使用system scope将它们添加到pom中。

我认为那是有问题的,所以我正在寻找清理我的构建。我通过.m2/repository插件将jar手动半手动安装到我的install:install-file。这对我很好,但我团队中的其他人呢?我们很小,设置Nexus并不是我们的选择。我已经向pom.xml添加了评论,解释了如何为每个jar运行install:install-file

我对install:install-file解决方案没问题,但我仍然希望在项目的版本控制中包含这些工件,而不仅仅是将它们放在我的文件系统上。< / p>

将它们保存在src/main/webapp/WEB-INF/lib中不起作用,因为它会自动将它们添加到生成的战争工件中(离题:如果maven只是继续将它们添加到类路径中,我会完成,不需要for install:install-file!)

问题:在maven目录布局中是否有一个受制裁的地方我可以收集这些.jar文件,以便我可以将它们作为我项目的一部分?

我确实意识到这里发生了什么--Maven正在尝试将依赖的jar 保留在我的构建之外,以便当其他项目依赖于我的构建时,他们可以解决传递依赖性。这对于进入公共maven repos的开源项目来说非常好,但是我敢打赌,绝大多数使用Maven的人正在研究像这样的“叶子”项目,并且有一种方法真的很方便将jar文件作为项目的一部分包括在内,而不是跳过这么多的箍。

5 个答案:

答案 0 :(得分:5)

如果按照Jan的建议设置Nexus或只是一个简单的文件服务器仓库真的太麻烦了,还有其他一些选择:

  • 只需包含JAR和一个脚本,将其全部安装在您选择的版本控制目录中。不需要Maven结构来制裁它。
  • 将您的版本控制系统用作存储库的主机,可以在主项目中作为分支单独使用,也可以作为单独的项目使用。让您在版本控制上已有的任何备份,安全性等应用于存储库,而不将jar包含在实际被检出并提交的文件集中。
  • 将jar包含在一个文件夹中,该文件夹充当与其余代码签出的迷你存储库。让pom.xml指向该文件夹作为它使用的存储库。我不是100%确定这是可能的,但似乎很可能。

答案 1 :(得分:3)

这里已经有很多好的答案,你应该强烈考虑为你的小组设置一个存储库管理器,例如Archiva,因为它现在和将来都会提供其他好处。

但是,要直接回答您的问题,以下是使用Maven在版本控制中存储依赖关系的模式:http://brettporter.wordpress.com/2009/06/10/a-maven-friendly-pattern-for-storing-dependencies-in-version-control/

请记住,它将项目限制为自包含使用,但如果您开始希望将其作为其他Maven项目的依赖项共享,则仍需要设置存储库。

答案 2 :(得分:2)

我认为您的最佳解决方案是设置内部存储库。首先不需要设置整个Nexus。任何简单的网络服务器都可以在某个地方充足或共享文件夹。

检查Maven DOC如何设置内部存储库。

答案 3 :(得分:2)

在我的公司,我们正在使用Archiva,它是迄今为止最简单的Repository Manager来设置和维护。特别是如果你使用独立版本。每个开发人员只需在profile文件中设置~/.m2/settings.xml即可指向内部存储库。如果这太麻烦了,只需将内部存储库直接放在<repositories/> 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>

如果设置Repository Manager太麻烦,我认为您需要重新考虑手动将内容手动添加到本地存储库的替代方法,这非常容易出错且耗时。我为个人开发运行了一个Archiva实例,因为它很容易添加release插件并管理版本,而不必记住将内容添加到本地存储库所需的所有神秘-D选项每台机器。复制~/.m2/settings.xml文件非常简单,如果它在一台机器上运行,则可以在所有文件上运行。

以下是您添加到pom.xml以启用自动执行发布并将工件推送到存储库的内容,在我的例子中是Archiva。

<distributionManagement>
   <repository>
       <id>internal</id>
       <name>Internal Archiva Repository</name>
       <url>http://maven.mycompany.com/repository/internal/</url>
       <layout>default</layout>
       <uniqueVersion>false</uniqueVersion>
   </repository>
   <snapshotRepository>
       <id>snapshots</id>
       <name>Internal Archiva Repository</name>
       <url>http://maven.mycompany.com/repository/snapshots/</url>
       <layout>default</layout>
       <uniqueVersion>false</uniqueVersion>
   </snapshotRepository>
</distributionManagement>

然后您只需mvn clean release:prepare自动更新pom.xml版本签入代码以及可选分支释放并打包所有工件,然后mvn release:perform将工件推送到远程存储库并签入新版本的pom.xml,您已准备好开始开发下一个版本。

快照到达snaphots,Releases会自动发布到internal。你必须配置scm插件,但这只是你的几行配置只需触摸一次。

这就是git的样子,我们使用Gitorious作为我们的git Repository Manager

<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>

运行Linux的旧台式计算机可以为开发团队处理此类存储库职责,而无需涉及采购和IT。

答案 4 :(得分:2)

我在现实生活中没有使用它,但它似乎正在工作:只需在源代码树中粘贴一个存储库布局(使用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>

示例树如下:

.
|-- 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"