我有一个多模块Maven项目,用于生产单个弹簧靴肥罐。我的项目看起来像这样。
- Parent Module Aggergator
- A
- B
- C
- app <-- app.jar is the only thing I want to publish
在我的情况下,模块A,B,C仅由应用程序使用过,不应发布到Maven存储库中。我将应用程序拆分为多模块项目,因为应用程序中包含很多代码,并且可以通过这种方式工作。
当前app.jar
将包含在其中a.jar, b.jar c.jar
。
有没有办法告诉Maven,应该只将模块A,B,C中的已编译类插入到app.jar classes文件夹中,而不必产生A.JAR,B.JAR,C.JAR?
答案 0 :(得分:2)
我将Maven Shade插件用于我的多模块项目;它会创建一个JAR并将每个模块提取到其中,而不是创建多个JAR文件:
父母pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<groupId>...</groupId>
<artifactId>pipeline</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>firehose</module>
<module>gson</module>
<module>lambda</module>
<module>mapper</module>
<module>model</module>
<module>receiver</module>
<module>redshift</module>
<module>reloader</module>
<module>s3</module>
<module>sns</module>
<module>sqs</module>
<module>systemstests</module>
<module>transaction</module>
<module>utility</module>
</modules>
<dependencies>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
孩子pom.xml
(JAR):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>...</groupId>
<artifactId>pipeline</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lambda</artifactId>
<dependencies>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<finalName>MyJar</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
答案 1 :(得分:0)
这是没有答案。
有没有办法告诉Maven模块A的编译类, B,C应该只插入到app.jar classes文件夹中 生产A.JAR,B.JAR,C.JAR?
您可以使用the repackage
goal of the spring boot maven plugi n将依赖关系平化为uber jar中的类。
在我的情况下,模块A,B,C仅由应用程序使用过,不应被 发布到Maven仓库中。
将模块添加到本地存储库中确实是要具有有效和标准版本。
否则,您将需要在每次运行spring boot应用程序时系统地编译每个模块。
实际上,有时您需要构建依赖关系,而其他时候则不需要,因为它们已经更新。
否则,您将受到束缚,通过添加手动任务来扭曲默认的Maven工作方式,以从Spring Boot模块中编译其他模块,并将已编译的类移入Spring Boot模块中。对于必须阅读/维护此配置的人们来说,这确实不是一件礼物。