Maven 2在开发的实验/快速和粗糙的模型阶段快把我逼疯了。

我有一个pom.xml文件,它定义了我想要使用的web-app框架的依赖关系,我可以从该文件快速生成启动项目。然而,有时我想链接到一个尚未定义pom.xml文件的第三方库,因此我不会手动为第三方库创建pom.xml文件并安装它,并将依赖项添加到我的pom.xml中,我只想告诉Maven:“除了我定义的依赖项之外,还包括/lib中的任何jar。”

似乎这应该是简单的,但如果是,我错过了一些东西。

任何关于如何做到这一点的建议都非常感谢。除此之外,如果有一种简单的方法将maven指向/lib目录,并轻松地创建一个pom.xml,将所有附带的jar映射到一个依赖项,然后我可以将其命名为/ install并链接到它,这也足够了。


当前回答

如果您想要一个快速而简单的解决方案,您可以执行以下操作(尽管我不建议将此方法用于测试项目之外的任何项目,maven会详细地抱怨这是不合适的)。

为您需要的每个jar文件添加一个依赖项,最好使用perl脚本或类似的东西,并将其复制/粘贴到pom文件中。

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

其他回答

对于那些在这里没有找到好的答案的人,这是我们正在做的事情,以获得一个包含所有必要依赖项的罐子。这个答案(https://stackoverflow.com/a/7623805/1084306)提到了使用Maven Assembly插件,但实际上并没有给出一个示例。如果你不从头到尾看完答案(答案相当长),你可能会错过它。将以下内容添加到pom.xml中将生成target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

Maven安装插件使用命令行将jar安装到本地存储库中,POM是可选的,但你必须指定GroupId, ArtifactId, Version和Packaging(所有POM的东西)。

尽管它并不完全适合您的问题,但我还是把它放在这里。我的要求是:

在线maven存储库中找不到的jar应该在SVN中。 如果一个开发人员添加了另一个库,其他开发人员不应该费心手动安装它们。 IDE(在我的例子中是NetBeans)应该能够找到源代码和javadocs来提供自动补全和帮助。

让我们先谈谈(3):只是将jar放在一个文件夹中,然后以某种方式将它们合并到最终的jar中,这在这里是行不通的,因为IDE无法理解这一点。这意味着必须正确安装所有的库。但是,我不想让每个人都使用“mvn安装文件”安装它。

在我的项目中,我需要元部件。开始吧:

创建一个新的maven项目(命名为“shared-libs”或类似的名称)。 下载元部件并将压缩文件解压到src/main/lib中。 文件夹doc/api包含javadocs。创建内容的压缩文件(doc/api/api.zip)。 像这样修改pom 构建项目并安装库。 将库作为依赖项添加到项目中,或者(如果在共享库项目中添加了依赖项)将共享库添加为依赖项,以一次性获得所有库。

每当你有一个新的库,只需添加一个新的执行,并告诉每个人重新构建项目(你可以用项目层次结构来改进这个过程)。

仅用于丢弃代码

设置scope == system,只需要创建groupId, artifactId和version

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

注意:系统依赖关系不会复制到生成的jar/war中 (参见如何在使用maven构建的war中包含系统依赖项)

如果您想要一个快速而简单的解决方案,您可以执行以下操作(尽管我不建议将此方法用于测试项目之外的任何项目,maven会详细地抱怨这是不合适的)。

为您需要的每个jar文件添加一个依赖项,最好使用perl脚本或类似的东西,并将其复制/粘贴到pom文件中。

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";