如何将Maven模块作为.class依赖项而不是jar嵌入?

时间:2018-08-13 19:27:02

标签: java maven

我有一个多模块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?

2 个答案:

答案 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模块中。对于必须阅读/维护此配置的人们来说,这确实不是一件礼物。