# 如何使用Maven生成能直接运行的jar包 ## 目录 1. [Maven基础概念](#maven基础概念) 2. [创建可执行Jar包的三种方式](#创建可执行jar包的三种方式) 3. [使用maven-jar-plugin基础配置](#使用maven-jar-plugin基础配置) 4. [使用maven-assembly-plugin详解](#使用maven-assembly-plugin详解) 5. [使用maven-shade-plugin高级方案](#使用maven-shade-plugin高级方案) 6. [依赖管理与类加载机制](#依赖管理与类加载机制) 7. [常见问题与解决方案](#常见问题与解决方案) 8. [生产环境最佳实践](#生产环境最佳实践) 9. [性能优化建议](#性能优化建议) 10. [扩展知识:Spring Boot的特殊处理](#扩展知识spring-boot的特殊处理) --- ## Maven基础概念 ### 1.1 Maven项目结构 标准的Maven项目遵循约定优于配置的原则: my-app/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── App.java │ │ └── resources/ │ └── test/ │ ├── java/ │ └── resources/
### 1.2 POM文件核心元素 ```xml <project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- 插件配置区域 --> </plugins> </build> </project> validate → compile → test → package → verify → install → deploypackage阶段完成| 插件名称 | 产出类型 | 依赖处理方式 | 适用场景 |
|---|---|---|---|
| maven-jar-plugin | 普通JAR | 外部lib目录 | 简单应用 |
| maven-assembly-plugin | 胖JAR | 全部打包进JAR | 需要独立分发 |
| maven-shade-plugin | 胖JAR(重命名) | 合并+重命名 | 解决依赖冲突 |
public class App { public static void main(String[] args) { System.out.println("Hello World!"); } } <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.2</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> target/ ├── my-app-1.0.jar └── lib/ ├── dependency1.jar └── dependency2.jar java -jar target/my-app-1.0.jar <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <descriptors> <descriptor>src/main/assembly/custom.xml</descriptor> </descriptors> 示例custom.xml:
<assembly> <id>bundle</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>true</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>src/main/resources</directory> <outputDirectory>/</outputDirectory> </fileSet> </fileSets> </assembly> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <configuration> <relocations> <relocation> <pattern>com.google.guava</pattern> <shadedPattern>com.shaded.guava</shadedPattern> </relocation> </relocations> </configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> </transformers> <dependency> <scope>provided</scope> <!-- 不会打包进可执行JAR --> </dependency> NoClassDefFoundError
mvn dependency:tree分析依赖No main manifest attribute
<mainClass>配置正确版本冲突
mvn dependency:analyze<exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven-shade-plugin.version>3.2.4</maven-shade-plugin.version> </properties> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> </excludes> </filter> </filters> </configuration> 并行构建:
mvn -T 1C package 跳过测试:
mvn package -DskipTests <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.DemoApplication</mainClass> <executable>true</executable> </configuration> </plugin> BOOT-INF/ ├── classes/ ├── lib/ META-INF/ org/ public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } 本文详细介绍了三种生成可执行JAR的方案,建议根据项目需求选择: - 简单应用:maven-jar-plugin - 独立分发:maven-assembly-plugin - 企业级应用:maven-shade-plugin - Spring Boot项目:spring-boot-maven-plugin “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。