溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Maven生成能直接運行的jar包

發布時間:2021-11-12 10:33:48 來源:億速云 閱讀:530 作者:小新 欄目:云計算
# 如何使用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>

1.3 Maven生命周期

  • validatecompiletestpackageverifyinstalldeploy
  • 生成可執行JAR主要在package階段完成

創建可執行Jar包的三種方式

2.1 基礎方案對比

插件名稱 產出類型 依賴處理方式 適用場景
maven-jar-plugin 普通JAR 外部lib目錄 簡單應用
maven-assembly-plugin 胖JAR 全部打包進JAR 需要獨立分發
maven-shade-plugin 胖JAR(重命名) 合并+重命名 解決依賴沖突

2.2 Main-Class要求

public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

使用maven-jar-plugin基礎配置

3.1 最小配置示例

<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>

3.2 執行流程

  1. 編譯代碼
  2. 生成MANIFEST.MF文件
  3. 創建包含以下結構的輸出:
    
    target/
    ├── my-app-1.0.jar
    └── lib/
       ├── dependency1.jar
       └── dependency2.jar
    

3.3 運行命令

java -jar target/my-app-1.0.jar

使用maven-assembly-plugin詳解

4.1 完整配置方案

<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>

4.2 自定義Assembly描述符

<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>

使用maven-shade-plugin高級方案

5.1 基礎配置

<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>

5.2 高級特性

解決依賴沖突

<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>

依賴管理與類加載機制

6.1 類加載順序

  1. Bootstrap ClassLoader
  2. Extension ClassLoader
  3. System ClassLoader
  4. 自定義ClassLoader

6.2 胖JAR的類加載特點

  • URLClassLoader處理嵌套JAR
  • 資源加載順序依賴JAR文件中的物理順序

6.3 依賴范圍影響

<dependency>
    <scope>provided</scope> <!-- 不會打包進可執行JAR -->
</dependency>

常見問題與解決方案

7.1 典型問題清單

  1. NoClassDefFoundError

    • 檢查依賴是否正確打包
    • 使用mvn dependency:tree分析依賴
  2. No main manifest attribute

    • 確認<mainClass>配置正確
    • 檢查MANIFEST.MF生成位置
  3. 版本沖突

    • 使用mvn dependency:analyze
    • 排除特定依賴:
    <exclusions>
       <exclusion>
           <groupId>commons-logging</groupId>
           <artifactId>commons-logging</artifactId>
       </exclusion>
    </exclusions>
    

生產環境最佳實踐

8.1 版本管理策略

<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>

8.2 分層打包策略

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
            </excludes>
        </filter>
    </filters>
</configuration>

性能優化建議

9.1 構建加速技巧

  1. 并行構建:

    mvn -T 1C package
    
  2. 跳過測試:

    mvn package -DskipTests
    

9.2 JAR優化方案

  • 使用ProGuard代碼混淆
  • 壓縮資源文件
  • 分模塊打包

擴展知識:Spring Boot的特殊處理

10.1 spring-boot-maven-plugin

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.example.DemoApplication</mainClass>
        <executable>true</executable>
    </configuration>
</plugin>

10.2 分層JAR結構

BOOT-INF/
├── classes/
├── lib/
META-INF/
org/

10.3 自定義Loader

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 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女