Maven - 为 java 项目中的每个 java 包创建一个 jar
Maven - creating a jar for every java package in java project
假设我有 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,但是里面的内容是相同的,这意味着排除条款不起作用。我尝试只排除 class(relative/absolute 路径) 和包。不要问我为什么这样做是为了家庭作业,这没有多大意义!
这是我尝试做的方法,如果还有其他更有效的方法,请随时与我分享!
编辑:不得使用模块化结构,它必须是一个项目。
提前致谢
已经在评论中回答了,但这里有一个例子。
父 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个child/modules个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>
我接受上面的答案是正确的,因为这是正确的做法,但如果像我这样的疯狂孩子试图以错误的方式去做,方法如下:
<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>
注意使用 class 而不是 java,因为它使用编译扩展!至于其他文件,它们是class路径
上的资源
假设我有 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,但是里面的内容是相同的,这意味着排除条款不起作用。我尝试只排除 class(relative/absolute 路径) 和包。不要问我为什么这样做是为了家庭作业,这没有多大意义! 这是我尝试做的方法,如果还有其他更有效的方法,请随时与我分享!
编辑:不得使用模块化结构,它必须是一个项目。
提前致谢
已经在评论中回答了,但这里有一个例子。
父 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个child/modules个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>
我接受上面的答案是正确的,因为这是正确的做法,但如果像我这样的疯狂孩子试图以错误的方式去做,方法如下:
<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>
注意使用 class 而不是 java,因为它使用编译扩展!至于其他文件,它们是class路径
上的资源