【问题标题】:Maven - creating a jar for every java package in java projectMaven - 为java项目中的每个java包创建一个jar
【发布时间】:2020-05-16 03:26:06
【问题描述】:

假设我有 3 个包,需要为每个包创建一个 jar,每个包只包含当前包中的内容。我的尝试是:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <id>first-jar</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <classifier>first-jar</classifier>
                            <excludes>
                                <exclude>/maven.task.3/src/main/java/third/ThirdMain.java
                                </exclude>
                                <exclude>/maven.task.3/src/main/java/second/SecondMain.java
                                </exclude>
                            </excludes>
                        </configuration>
                    </execution>
                    <execution>
                        <id>second-jar</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <classifier>second-jar</classifier>
                            <excludes>
                                <exclude>/maven.task.3/src/main/java/first/FirstMain.java
                                </exclude>
                                <exclude>/maven.task.3/src/main/java/third/ThirdMain.java
                                </exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

这确实会创建不同的 jar,但是里面的内容是一样的,这意味着 exclude 子句不起作用。我尝试只排除类(相对/绝对路径)和包。不要问我为什么这样做是为了家庭作业,它没有多大意义! 这是我尝试做的方式,如果有其他更有效的方式,请随时与我分享!

编辑:不得使用模块化结构,它必须是一个单独的项目。

提前致谢

【问题讨论】:

  • 制作单独的模块,就是这样......(多模块构建)它有几个模块,其中包含每个包......从单个源目录生成不同的 jar 是一个坏主意......
  • 提示:maven-jar 插件不适用于 .java 文件,但适用于在 target/classes 中找到的已编译 .class 文件
  • @khmarbaise 我认为我的任务是严格针对我不使用模块的事实,我想到了,但是是的......遗憾的是,在这种情况下它必须是更大的邪恶:(跨度>
  • @GyroGearless 你在类部分是正确的,但我怎么能排除整个包,因为这样我只排除了类但文件夹在 jar 中保持为空?
  • 模块化结构是一种模块化结构,应该在您的构建结构中表示。如果您试图强制进入一个会失败并导致许多问题的模块......并且您正在与 Maven 战斗,这是一场您将失去的战斗。

标签: java maven jar maven-plugin


【解决方案1】:

已经在 cmets 中回答了,但这里有一个例子。

父 pom:

<?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.essexboy</groupId>
  <artifactId>parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>jar1</module>
    <module>jar2</module>
  </modules>

</project>

还有 2 个子/模块 poms,只有 artifactId 不同:

<?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>
    <artifactId>parent</artifactId>
    <groupId>com.essexboy</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>jar1</artifactId>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
  </build>
</project>

额外信息

我使用命令创建了父级:

mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root -DarchetypeVersion=RELEASE

然后用命令创建了2个模块

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=RELEASE

如果您必须有一个 jar 项目(没有模块和父项目),您可以使用 shade-plugin

<?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.essexboy</groupId>
    <artifactId>double-jar</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>double-jar</name>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <id>1</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <finalName>jar1</finalName>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>com/essexboy/App2*</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                    <execution>
                        <id>2</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <finalName>jar2</finalName>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>com/essexboy/App1*</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

【讨论】:

  • @Esses Boy 是的,正如我上面提到的,这是一种更清洁、更容易的方法,但是我必须只使用一个项目而不是模块化结构来做到这一点。
  • @AlexVulchev 我已经更新了答案以显示如何使用阴影插件来完成,我很高兴还有其他方法可以做到这一点,但这有效。
  • 你为什么要使用 shade-plugin 并创建另一个时间的 jar ?根据模块,已经为每个模块创建了不同的 jars....
  • @khmarbaise 因为之前的评论,提问者坚持在单个项目中进行,即没有模块。我同意你的看法,它应该是 2 个模块。
【解决方案2】:

我接受了上述答案是正确的,因为这是正确的做法,但如果像我这样的疯狂孩子试图以错误的方式做事,方法如下:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <id>first-jar</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <classifier>first-jar</classifier>
                            <includes>
                                <include>first/FirstMain.class</include>
                                <include>log4j.properties</include>
                                <include>pictures/12px-Commons-logo.svg.png</include>
                                <include>textFiles/first.txt</include>
                            </includes>
                        </configuration>
                    </execution>
    </plugin>

注意使用类而不是java,因为它使用编译扩展!至于其他文件,它们是类路径上的资源

【讨论】:

    猜你喜欢
    • 2019-07-17
    • 2014-11-19
    • 2022-01-16
    • 2014-04-09
    • 1970-01-01
    • 2013-08-17
    • 2019-06-19
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多