【问题标题】:Create JAR file from multiple project, dependent to each other从多个项目创建 JAR 文件,相互依赖
【发布时间】:2017-10-02 18:13:04
【问题描述】:

我有三个 apache-camel 项目,比如说project-Aproject-Bproject-C。 project-A 具有依赖于 project-B 的 java main 方法,而 project-B 依赖于 project-C(在 project-B 中添加了 project-C 的依赖项,在 project-A 中添加了 project-B 的依赖项)。我想为项目-B 创建 jar 文件。我试图通过将以下配置放入项目-A 的 pom.xml 中来创建 jar 文件-

<plugins>
     <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <excludes>
                                <exclude>org.jboss.seam:jboss-seam</exclude>
                            </excludes>
                        </artifactSet>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>com.getusroi.featureinstaller.FeatureMetaInfoConfigInstaller</Main-Class>
                                </manifestEntries>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/services/org/apache/camel/TypeConverter</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />

                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/maven/plugin.xml</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/spring.tooling</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/info.xml</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/DISCLAIMER</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/README.txt</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/DEPENDENCIES</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/LICENSE</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/LICENSE.txt</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/NOTICE</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                                <resource>META-INF/NOTICE.txt</resource>
                            </transformer>
                        </transformers>
                        <filters>
                            filter out jar signatures from shaded jars
                            <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>
        <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</plugins>

我面临的问题: 在项目-B 和项目-C 中,我有两个同名文件,因此在创建 jar 文件后,一个文件被另一个文件覆盖。任何帮助将非常感激。

【问题讨论】:

    标签: java maven jar executable-jar


    【解决方案1】:

    有一个父项目同时构建所有 3 个:

    <?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>
    
      <groupId>com.greg</groupId>
      <artifactId>example</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>pom</packaging>
    
      <name>example</name>
    
      <modules>
        <module>project-a</module>
        <module>project-b</module>
        <module>project-c</module>
      </modules>
    
    </project>
    

    每个项目都可以根据需要具有本地项目依赖项,您的 project-b pom.xml 将如下所示:

    <?xml version="1.0"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <groupId>com.greg</groupId>
        <artifactId>example</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
    
      <artifactId>project-b</artifactId>
    
      <dependencies>
        <dependency>
          <groupId>com.greg</groupId>
          <artifactId>project-c</artifactId>
          <version>${project.version}</version>
        </dependency>
      </dependencies>
    
     <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>3.0.0</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer                                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <manifestEntries>
                                            <Main-Class>com.greg.Application</Main-Class>
                                        </manifestEntries>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
            </plugins>
        </build>
    
    </project>
    

    将创建一个运行项目-b/target-1.0-SNAPSHOT.jar 中的主要方法 com.greg.Application 的可执行 jar

    【讨论】:

    • 感谢您的回答,&lt;Main-Class&gt;com.greg.Application&lt;/Main-Class&gt; 每个项目都需要这个吗?我在 project-A 中只有一个主要方法
    • 你只需要在你想要创建可执行jar的项目中使用shade插件,其他项目只是作为依赖、库。所以 2 个项目没有插件,它们帮助构建 1 个生成 jar 的项目。
    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多