2011-03-14 55 views
12

因此,我有一个战争项目,其中有几个依赖jar,这些jar在任何版本库中都不可用。直到最近,我一直在src/main/webapp/WEB-INF/lib,并将它们添加到与system scope pom。Maven:在项目版本控制中保留相关的jar文件

我明白这是有问题的,所以我正在寻找清理我的构建。我已经通过install:install-file插件将这些罐子半手动安装到我的.m2/repository中。这对我来说很好,但我的团队中的其他人呢?我们很小,设置Nexus对我们来说不是一个真正的选择。我已经使用pom.xml来解释如何为每个罐子运行install:install-file

我与install:install-file解决好了,但我仍想包括在我的项目的版本控制这些文物,而不是仅仅让他们洒我的文件系统。

他们留在src/main/webapp/WEB-INF/lib不起作用,因为这会自动将它们添加到导致战争神器(题外话:如果行家只会继续前进,把它们添加到这里的classpath中我会做,无需安装:安装文件)

问:有在Maven目录布局的批准地方,我可以掖这些.jar文件,只是这样我就可以让他们为我的项目的一部分吗?

我不知道这是怎么回事这里 - Maven是试图保持依赖jar 我的身材之外这样,当其他项目依赖于我的生成,使其能够解决的传递依赖。对于进入公共maven回购站的开源项目来说,这非常好,但我敢打赌,绝大多数使用Maven的人正在从事诸如此类的“叶子”项目工作,并且拥有一个方法非常方便将jar文件作为项目的一部分,而不用跳过这么多的箍。

+3

设置Nexus是很容易的。我有一个实例在家里为自己运行。 – ColinD 2011-03-14 16:07:46

+0

用nexus创建一个本地仓库太过于矫枉过正?你可以用它代理所有的maven回购站并保留这些第三方的罐子。 – Augusto 2011-03-14 16:09:15

+3

当然,我可以安装Nexus。但之后我不得不要求每个接触这个项目的人都这样做。或者将其设置在服务器上,备份它,担心安全性等。它似乎是处理一些定制jar文件的非常麻烦的解决方案。 – 2011-03-14 17:09:58

回答

5

如果设置的Nexus或只是一个简单的文件服务器回购扬的建议是真的太麻烦了,这里有一些其他的选项:

  • 只需包括JAR文件,并且将它们安装脚本全部放在您选择的版本控制目录中。 Maven结构无需对其进行处理。
  • 使用您的版本控制系统作为存储库的主机,既可以在您的主项目的分支上,也可以作为单独的项目。让任何已经用于版本控制的备份,安全性等应用于存储库,而不在实际正在签出和提交的文件集中包含jar。
  • 将jar包含在一个文件夹中,该文件夹充当与其余代码签出的小型存储库。让pom.xml指向该文件夹作为它使用的存储库。我不是100%肯定这是可能的,但它似乎是可能的。
+0

我们按照你的第一个建议。 Maven不支持你最后的建议。 – 2011-03-14 18:12:35

+0

+1:最后的建议似乎也可以使用(使用Maven 2.2.1)。 – Lars 2011-03-14 22:01:49

+2

我几乎想给你一个+1,只是为了不回应“但实际上,设置Nexus并不困难。” :-)在一些(许多?)项目中设置像Nexus这样的工具根本不是一种选择。如果您没有团队/资源像维护您的源代码回购一样仔细维护该外部存储库,那么将主题保存在主源代码回购之外并不是一个好主意。使用ant的人只是在lib目录中放入jar文件,他们就完成了。我经常希望Maven会采用“简单的事情应该很简单”的口头禅。感谢您的答复。 – 2011-03-20 23:34:50

2

我认为你的情况最好的解决方案将是建立一个内部存储库。首先不需要设置整个Nexus。任何简单的网络服务器都将是足够的或共享文件夹的地方。

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

+0

但是如果内部存储库不是一个选项呢? – Lars 2011-03-14 17:37:36

+2

Maven包含install:install-file就是为了这个目的。将〜/ .m2/repository放到/ network/maven/repository有多难?也许nexus是矫枉过正,也许HTTP是矫枉过正,但文件服务器?这些如何不是一种选择? – 2011-03-14 17:45:38

+1

@Chris在一个足够复杂的公司中,源控制服务器可能是所有相关方都可访问的唯一服务器;尽管长期内部的maven仓库可能是最好的选择,但需要一些东西来弥合这个过渡期。 – Lars 2011-03-14 17:53:01

2

在我的公司我们使用的是Archiva,它是目前为止最简单的Repository Manager设置和维护。特别是如果你使用独立版本。每位开发人员只需在其~/.m2/settings.xml文件中设置profile以指向内部存储库。如果这太麻烦了,只需将<repositories/>中的内部存储库直接放入pom.xml即可,但这是非常糟糕的做法。如果存储库网址不断移动,则必须更新所有项目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> 

如果建立一个仓库管理器是太麻烦了,我想你需要手动添加的东西替代重新用手本地资源库,这是非常容易出错且费时。我为我的个人开发运行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并发布到internal在发布插件自动运行。你必须配置SCM插头为好,但就是配置的短短的几行,你只需要轻触一下,以及。

这是它看起来像git的,我们使用Gitorious作为我们的Git仓库经理

<scm> 
    <connection>scm:git:git://gitorious.mycompany.com:myproject/myproject.git</connection> 
    <developerConnection>scm:git:ssh://[email protected]/myproject/myproject.git</developerConnection> 
    <url>http://gitorious.mycompany.com/myproject/myproject</url> 
</scm> 

运行Linux可以处理存储库的职责是这样一个开发团队,而无需涉及采购的旧台式电脑和IT。

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

那里有许多已经很好的答案,你应该认真考虑您的组建立一个仓库管理器,如Archiva,因为它会无论是现在还是在提供其他好处时间。

然而,直接回答你的问题,这里是存储在版本控制Maven的依赖模式:http://brettporter.wordpress.com/2009/06/10/a-maven-friendly-pattern-for-storing-dependencies-in-version-control/

请记住,它限制了该项目所使用的警告自足本身 - 如果您开始希望将其作为其他Maven项目的依赖项共享,您仍然需要设置存储库。

相关问题