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

其他回答

systemPath的问题是依赖项的jar不会作为可传递依赖项沿着工件分布。试试我在这里发布的内容:最好是将项目jar文件Mavenize,还是将它们放在WEB-INF/lib中?

然后像往常一样声明依赖项。

请阅读脚注。

在我们的项目中起作用的是Archimedes Trajano写的,但是我们在.m2/settings.xml中有这样的东西:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

*应该改为central。因此,如果他的回答不适合您,您应该检查settings.xml

使用<scope>system</scope>是一个很糟糕的想法,其他人已经解释了原因,手动将文件安装到本地存储库将使构建不可复制,并且使用<url>file://${project. bat。basedir}/repo</url>也不是一个好主意,因为(1)它可能不是一个格式良好的文件url(例如,如果项目签出在一个包含不寻常字符的目录中),(2)如果这个项目的POM被用作其他项目的依赖项,结果是不可用的。

假设您不愿意将工件上传到公共存储库,Simeon建议使用助手模块来完成这项工作。但现在有一个更简单的方法……

建议

使用non-maven-jar-maven-plugin。完全符合您的要求,没有其他方法的任何缺点。

在与CloudBees的人员进行了长时间的讨论之后,他们提出了一个有趣的解决方案:

创建一个伪Maven项目,将一个预先存在的JAR附加为主要工件,运行到所属的POM安装:安装文件执行。这里有一个类似POM的例子:

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

但要实现这一目标,必须改变现有的项目结构。首先,您应该记住,对于每种这样的JAR,都应该创建不同的伪Maven项目(模块)。并且应该创建一个父Maven项目,包括所有子模块,即:所有JAR包装器和现有的主项目。结构可以是:

根项目(此包含父POM文件,包括所有带有模块XML元素的子模块)(POM打包) JAR 1包装器Maven子项目(POM包装) JAR 2包装器Maven子项目(POM打包) 主要现有的Maven子项目(WAR, JAR, EAR ....包装)

当通过mvn:install或mvn:packaging运行父模块时,将强制执行子模块。这可能是一个缺点,因为项目结构应该改变,但最后提供了一个非静态的解决方案

我发现了一个奇怪的解决办法:

使用Eclipse

创建简单的(非maven) Java项目 添加一个Main类 将所有罐子添加到类路径中 导出可运行JAR(这很重要,因为这里没有其他方法可以做到这一点) 选择将所需的库提取到生成的JAR中 决定牌照事宜 tadammm……将生成的jar安装到m2repo 将这个依赖项添加到其他项目中。

欢呼, Balint