Maven 2在开发的实验/快速和粗糙的模型阶段快把我逼疯了。
我有一个pom.xml文件,它定义了我想要使用的web-app框架的依赖关系,我可以从该文件快速生成启动项目。然而,有时我想链接到一个尚未定义pom.xml文件的第三方库,因此我不会手动为第三方库创建pom.xml文件并安装它,并将依赖项添加到我的pom.xml中,我只想告诉Maven:“除了我定义的依赖项之外,还包括/lib中的任何jar。”
似乎这应该是简单的,但如果是,我错过了一些东西。
任何关于如何做到这一点的建议都非常感谢。除此之外,如果有一种简单的方法将maven指向/lib目录,并轻松地创建一个pom.xml,将所有附带的jar映射到一个依赖项,然后我可以将其命名为/ install并链接到它,这也足够了。
尽管它并不完全适合您的问题,但我还是把它放在这里。我的要求是:
在线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
构建项目并安装库。
将库作为依赖项添加到项目中,或者(如果在共享库项目中添加了依赖项)将共享库添加为依赖项,以一次性获得所有库。
每当你有一个新的库,只需添加一个新的执行,并告诉每个人重新构建项目(你可以用项目层次结构来改进这个过程)。
在与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运行父模块时,将强制执行子模块。这可能是一个缺点,因为项目结构应该改变,但最后提供了一个非静态的解决方案
Java中scope='system'方法的解决方案:
public static void main(String[] args) {
String filepath = "/Users/Downloads/lib/";
try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {
List<String> result = walk.filter(Files::isRegularFile)
.map(x -> x.toString()).collect(Collectors.toList());
String indentation = " ";
for (String s : result) {
System.out.println(indentation + indentation + "<dependency>");
System.out.println(indentation + indentation + indentation + "<groupId>"
+ s.replace(filepath, "").replace(".jar", "")
+ "</groupId>");
System.out.println(indentation + indentation + indentation + "<artifactId>"
+ s.replace(filepath, "").replace(".jar", "")
+ "</artifactId>");
System.out.println(indentation + indentation + indentation + "<version>"
+ s.replace(filepath, "").replace(".jar", "")
+ "</version>");
System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
System.out.println(indentation + indentation + "</dependency>");
}
} catch (IOException e) {
e.printStackTrace();
}
}
要安装不在maven库中的第三方jar,使用maven-install-plugin。
步骤如下:
从源代码(网站)手动下载jar文件
创建一个文件夹,并将jar文件放在其中
运行以下命令在本地maven存储库中安装第三方jar
mvn install:install-file -dfile= -dgroupId=
-dartifactId= -dversion= -dpackaging=
下面是我用于simmonsite log4j的示例
mvn安装:安装文件
-Dfile=/Users/athanka/git/MyProject/repo/log4j- rollingappender .jar -DgroupId=uk.org.simonsite -DartifactId=log4j- rollingappender -Dversion=20150607-2059 -Dpackaging=jar
在pom.xml中包括如下所示的依赖项
< >的依赖
< groupId > uk.org.simonsite < / groupId >
< artifactId > log4j-rolling-appender < / artifactId >
<版本> 20150607 - 2059 > < /版本
< / >的依赖
运行mvn clean install命令创建您的打包
以下是参考链接:
https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html