You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Profiles配置,用Maven从单项目生成两个Jar包的方案咨询

Maven多Jar打包方案推荐

针对你的Maven项目打包需求,我推荐两种适配不同场景的方案,既符合Maven规范又能灵活满足你的定制化打包要求:

场景一:基于额外源码目录的双Jar打包

你的项目包含自定义源码目录<my_source_folder>,需要生成排除该目录的main.jar和仅包含该目录、排除src/main/java的my.jar,可以通过maven-jar-plugin + maven-assembly-plugin组合实现:

1. 配置maven-jar-plugin生成main.jar

默认的maven-jar-plugin会打包src/main/java下的类,我们只需要添加排除规则,跳过<my_source_folder>的类:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <!-- 排除自定义源码目录下的所有类 -->
        <excludes>
            <exclude>**/<my_source_folder>/**</exclude>
        </excludes>
    </configuration>
</plugin>

2. 配置maven-assembly-plugin生成my.jar

通过自定义assembly描述符,指定仅包含<my_source_folder>的源码,同时排除src/main/java的内容:
首先在项目根目录创建src/assembly/my-jar-assembly.xml:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>custom</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <!-- 包含自定义源码目录编译后的类文件 -->
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <includes>
                <include>**/<my_source_folder>/**</include>
            </includes>
        </fileSet>
        <!-- 排除src/main/java编译后的类文件 -->
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <excludes>
                <exclude>**/!${my_source_folder}/**</exclude>
            </excludes>
        </fileSet>
    </fileSets>
</assembly>

然后在pom.xml中配置插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.6.0</version>
    <executions>
        <execution>
            <id>build-my-jar</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <descriptors>
                    <descriptor>src/assembly/my-jar-assembly.xml</descriptor>
                </descriptors>
                <finalName>my</finalName>
            </configuration>
        </execution>
    </executions>
</plugin>

执行mvn package后,就能在target目录得到main.jar和my.jar。


场景二:Slim Jar(API/轻量类)+ Impl Jar(实现类)

这个场景更推荐Maven模块化拆分,这是长期维护的最优方案,比单模块打包更清晰、更符合Maven设计思想:

1. 模块化拆分方案

将原项目拆分为两个子模块:

  • my-project-api:存放所有API接口、DTO、轻量工具类等不需要实现的代码
  • my-project-impl:依赖my-project-api,存放所有接口的实现类、业务逻辑代码

父pom.xml配置

<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.example</groupId>
    <artifactId>my-project-parent</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>my-project-api</module>
        <module>my-project-impl</module>
    </modules>
</project>

my-project-api的pom.xml

<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">
    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-project-parent</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>my-project-api</artifactId>
    <packaging>jar</packaging>
    <!-- 这里只需要打包API相关代码,默认配置即可 -->
</project>

my-project-impl的pom.xml

<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">
    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-project-parent</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>my-project-impl</artifactId>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>my-project-api</artifactId>
            <version>1.0.0</version>
        </dependency>
        <!-- 其他依赖 -->
    </dependencies>
</project>

执行mvn clean package后,两个子模块的target目录会分别生成slim jar(my-project-api-1.0.0.jar)和impl jar(my-project-impl-1.0.0.jar)。

2. 单模块替代方案(不推荐长期使用)

如果暂时不想拆分模块,可以用maven-assembly-plugin按包路径过滤:
创建两个assembly描述符,分别指定包含API包和实现包:

  • src/assembly/slim-jar.xml:包含com.example.api、com.example.dto等轻量类路径
  • src/assembly/impl-jar.xml:包含com.example.impl等实现类路径
    然后在pom.xml中配置两个assembly执行任务,分别生成对应的jar包。

方案总结

  • 对于额外源码目录的打包需求,用maven-jar-plugin+maven-assembly-plugin的组合足够灵活
  • 对于API/实现分离的场景,模块化拆分是最优选择,它能让依赖关系更清晰,便于团队协作和后续维护

内容的提问来源于stack exchange,提问作者vsbehere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:22:27