最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java項目打包從JAR到Docker的全方位指南

 更新時間:2025年11月03日 08:46:26   作者:大頭an  
在實際開發(fā)中,將Java項目打包成可部署的格式是一個至關重要的環(huán)節(jié),本文將全面介紹Java項目的各種打包方式,從基礎的JAR打包到現(xiàn)代化的Docker容器化部署,需要的朋友可以參考下

?一、Java打包工具全景圖

在開始具體打包之前,我們先了解下主流的Java打包工具及其適用場景:

工具適用場景特點輸出格式
javac + jar簡單學習項目JDK內(nèi)置,無需額外配置JAR
Maven企業(yè)級項目強大的依賴管理和生命周期JAR, WAR
Gradle復雜大型項目靈活配置,構建性能高JAR, WAR, 多種格式
Spring Boot Maven PluginSpring Boot應用內(nèi)嵌服務器,開箱即用Executable JAR
jpackage桌面應用程序生成原生安裝包EXE, DMG, DEB
Docker微服務部署環(huán)境隔離,持續(xù)交付Docker Image

二、傳統(tǒng)JAR打包詳解

2.1 項目結構準備

一個標準的Java項目結構如下:

MyApp/
├── src/
│   └── com/example/
│       ├── Main.java
│       └── util/
│           └── StringUtil.java
├── lib/ (第三方依賴)
└── resources/ (配置文件)

2.2 手動打包實戰(zhàn)

對于簡單的項目,我們可以使用JDK自帶的工具手動打包:

# 1. 編譯Java源代碼
javac -d build/classes src/com/example/**/*.java

# 2. 創(chuàng)建清單文件(MANIFEST.MF)
cat > MANIFEST.MF << EOF
Manifest-Version: 1.0
Main-Class: com.example.Main
Created-By: Java Packager
EOF

# 3. 打包成JAR文件
jar cfm myapp.jar MANIFEST.MF -C build/classes .

# 4. 運行應用
java -jar myapp.jar

2.3 自動化構建腳本

為了提高效率,我們可以編寫構建腳本:

#!/bin/bash
# build.sh - Java項目自動構建腳本

echo "?? 開始構建Java項目..."

# 清理構建目錄
rm -rf build
mkdir -p build/classes

# 編譯源碼
echo "?? 編譯Java源碼..."
javac -d build/classes -sourcepath src src/com/example/**/*.java

# 拷貝資源文件
echo "?? 拷貝資源文件..."
cp -r resources/* build/classes/

# 創(chuàng)建清單文件
echo "?? 生成清單文件..."
cat > MANIFEST.MF << EOF
Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: $(find lib -name "*.jar" | tr '\n' ' ')
Build-Time: $(date)
EOF

# 打包JAR
echo "?? 打包JAR文件..."
jar cfm myapp.jar MANIFEST.MF -C build/classes .

# 清理臨時文件
rm MANIFEST.MF

echo "? 構建完成!輸出文件: myapp.jar"

三、Maven標準化打包

Maven是Java領域最流行的構建工具,提供了標準化的項目結構和構建流程。

3.1 標準Maven項目結構

project/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/ (Java源代碼)
│   │   │   └── com/example/
│   │   │       ├── Main.java
│   │   │       └── service/
│   │   └── resources/ (資源文件)
│   │       ├── application.properties
│   │       └── log4j2.xml
│   └── test/ (測試代碼)
│       └── java/
└── target/ (構建輸出目錄)

3.2 基礎pom.xml配置

<?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.example</groupId>
    <artifactId>myapp</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <properties>
        <!-- 統(tǒng)一版本管理 -->
        <java.version>11</java.version>
        <maven.compiler.version>3.8.1</maven.compiler.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.17.1</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <!-- 編譯器插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3.3 創(chuàng)建可執(zhí)行JAR的三種方式

方式一:使用maven-jar-plugin(依賴外置)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.example.Main</mainClass>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>

方式二:使用maven-assembly-plugin(胖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.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

方式三:使用maven-shade-plugin(推薦)

<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.Main</mainClass>
                    </transformer>
                    <!-- 處理Spring配置文件 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.handlers</resource>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

3.4 常用Maven命令

# 清理并打包
mvn clean package

# 跳過測試打包
mvn clean package -DskipTests

# 安裝到本地倉庫
mvn clean install

# 生成源碼包和文檔
mvn source:jar javadoc:jar

# 運行Spring Boot應用
mvn spring-boot:run

四、Web應用WAR包打包

對于Web應用,我們需要打包成WAR格式部署到Servlet容器。

4.1 Web項目結構

webapp/
├── pom.xml
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/
│       │       ├── controller/
│       │       ├── service/
│       │       └── config/
│       ├── resources/
│       └── webapp/ (Web資源)
│           ├── WEB-INF/
│           │   └── web.xml
│           ├── index.jsp
│           └── static/
│               ├── css/
│               ├── js/
│               └── images/

4.2 WAR打包配置

<!-- 修改打包方式為war -->
<packaging>war</packaging>

<build>
    <finalName>mywebapp</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.1</version>
            <configuration>
                <!-- 對于Spring Boot可以忽略web.xml -->
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <warSourceDirectory>src/main/webapp</warSourceDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>

4.3 Spring Boot外部容器部署

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
<!-- 排除內(nèi)嵌Tomcat,使用外部容器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

五、Gradle現(xiàn)代化構建

Gradle以其簡潔的DSL和出色的性能受到越來越多開發(fā)者的青睞。

5.1 基礎build.gradle配置

plugins {
    id 'java'
    id 'application'
}

group = 'com.example'
version = '1.0.0'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0'
    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.7.0'
}

application {
    mainClass = 'com.example.Main'
}

5.2 創(chuàng)建胖JAR

// 使用Shadow插件創(chuàng)建胖JAR
plugins {
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

shadowJar {
    archiveBaseName.set('myapp')
    archiveClassifier.set('')
    archiveVersion.set('')
    mergeServiceFiles()
}

// 或者自定義任務
task customFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
    archiveBaseName = 'myapp-all'
    from { 
        configurations.runtimeClasspath.collect { 
            it.isDirectory() ? it : zipTree(it) 
        } 
    }
    with jar
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

5.3 常用Gradle命令

# 構建項目
./gradlew build

# 創(chuàng)建胖JAR
./gradlew shadowJar

# 清理構建
./gradlew clean

# 運行應用
./gradlew run

六、Docker容器化部署

容器化部署已經(jīng)成為現(xiàn)代應用部署的標準方式。

6.1 多階段構建Dockerfile

# 第一階段:構建階段
FROM maven:3.8.4-openjdk-11 AS builder
WORKDIR /app

# 拷貝pom文件并下載依賴(利用Docker緩存)
COPY pom.xml .
RUN mvn dependency:go-offline

# 拷貝源碼并構建
COPY src ./src
RUN mvn clean package -DskipTests

# 第二階段:運行階段
FROM openjdk:11-jre-slim
WORKDIR /app

# 創(chuàng)建非root用戶(安全考慮)
RUN groupadd -r spring && useradd -r -g spring spring
USER spring

# 從構建階段拷貝JAR文件
COPY --from=builder /app/target/*.jar app.jar

# 健康檢查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8080/actuator/health || exit 1

# JVM參數(shù)優(yōu)化
ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -Djava.security.egd=file:/dev/./urandom"

# 暴露端口
EXPOSE 8080

# 啟動命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

6.2 Docker Compose編排

version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - DATABASE_URL=jdbc:mysql://db:3306/myapp
    depends_on:
      - db
    networks:
      - app-network
    deploy:
      resources:
        limits:
          memory: 512M
        reservations:
          memory: 256M

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db_data:

networks:
  app-network:
    driver: bridge

6.3 容器操作命令

# 構建鏡像
docker build -t myapp:1.0.0 .

# 運行容器
docker run -d -p 8080:8080 --name myapp myapp:1.0.0

# 使用Docker Compose
docker-compose up -d

# 查看日志
docker logs -f myapp

# 進入容器調(diào)試
docker exec -it myapp bash

七、高級打包技巧

7.1 使用jpackage創(chuàng)建原生安裝包(JDK 14+)

# 創(chuàng)建跨平臺安裝包
jpackage \
  --name MyApp \
  --input target/ \
  --main-jar myapp-1.0.0.jar \
  --main-class com.example.Main \
  --type app-image \
  --dest installers/ \
  --java-options '-Xmx256m'

# Windows特定選項
jpackage --type exe --win-console --icon app.ico

# macOS特定選項  
jpackage --type dmg --mac-package-identifier com.example.myapp

# Linux特定選項
jpackage --type deb --linux-package-name myapp

7.2 GraalVM原生鏡像

FROM ghcr.io/graalvm/native-image:22 AS builder
WORKDIR /app

COPY . .
RUN mvn clean package -DskipTests

# 構建原生鏡像
RUN native-image -jar target/myapp-1.0.0.jar \
    --no-fallback \
    --enable-https \
    -H:Name=myapp-native

# 運行階段
FROM alpine:latest
RUN apk --no-cache add libstdc++
COPY --from=builder /app/myapp-native /app/myapp-native

EXPOSE 8080
ENTRYPOINT ["/app/myapp-native"]

八、最佳實踐總結

8.1 版本管理

<!-- 統(tǒng)一版本管理 -->
<properties>
    <java.version>11</java.version>
    <maven.compiler.version>3.8.1</maven.compiler.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

8.2 安全考慮

  • 使用非root用戶運行容器
  • 定期更新基礎鏡像
  • 掃描鏡像安全漏洞

8.3 性能優(yōu)化

# 使用輕量級基礎鏡像
FROM openjdk:11-jre-slim

# 優(yōu)化JVM參數(shù)
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"

8.4 CI/CD集成示例

name: Java CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: 'maven'
    
    - name: Build and Test
      run: mvn clean package
      
    - name: Build Docker Image
      run: docker build -t myapp:${{ github.sha }} .
      
    - name: Deploy to Registry
      run: |
        echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
        docker push myapp:${{ github.sha }}

結語

Java項目打包已經(jīng)從簡單的JAR文件發(fā)展到現(xiàn)代化的容器化部署。掌握這些打包技術對于Java開發(fā)者至關重要。無論是傳統(tǒng)的Web應用還是現(xiàn)代的微服務,選擇合適的打包方式都能大大提高開發(fā)和部署效率。

以上就是Java項目打包從JAR到Docker的全方位指南的詳細內(nèi)容,更多關于Java項目打包從JAR到Docker的資料請關注腳本之家其它相關文章!

相關文章

  • 使用eclipse創(chuàng)建java項目的方法

    使用eclipse創(chuàng)建java項目的方法

    這篇文章主要為大家詳細介紹了使用eclipse創(chuàng)建java項目的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • SpringCloud @RefreshScope注解源碼層面深入分析

    SpringCloud @RefreshScope注解源碼層面深入分析

    @RefreshScope注解能幫助我們做局部的參數(shù)刷新,但侵入性較強,需要開發(fā)階段提前預知可能的刷新點,并且該注解底層是依賴于cglib進行代理的,所以不要掉入cglib的坑,出現(xiàn)刷了也不更新情況
    2023-04-04
  • JavaMe開發(fā)繪制可自動換行文本

    JavaMe開發(fā)繪制可自動換行文本

    JavaMe Graphics類中的drawString不支持文本換行,這樣繪制比較長的字符串時,文本被繪制在同一行,超過屏幕部分的字符串被截斷了。如何使繪制的文本能自動換行呢?
    2015-09-09
  • SpringBoot中實現(xiàn)訂單30分鐘自動取消的三種方案分享

    SpringBoot中實現(xiàn)訂單30分鐘自動取消的三種方案分享

    在電商和其他涉及到在線支付的應用中,通常需要實現(xiàn)一個功能:如果用戶在生成訂單后的一定時間內(nèi)未完成支付,系統(tǒng)將自動取消該訂單,本文將詳細介紹基于Spring Boot框架實現(xiàn)訂單30分鐘內(nèi)未支付自動取消的幾種方案,并提供實例代碼,需要的朋友可以參考下
    2023-10-10
  • 詳解RestTemplate的三種使用方式

    詳解RestTemplate的三種使用方式

    這篇文章主要介紹了詳解RestTemplate的三種使用方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Springboot+MyBatist實現(xiàn)前后臺交互登陸功能方式

    Springboot+MyBatist實現(xiàn)前后臺交互登陸功能方式

    這篇文章主要介紹了Springboot+MyBatist實現(xiàn)前后臺交互登陸功能方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringMVC集成Swagger實例代碼

    SpringMVC集成Swagger實例代碼

    本篇文章主要介紹了SpringMVC集成Swagger實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java8 LocalDateTime極簡時間日期操作小結

    Java8 LocalDateTime極簡時間日期操作小結

    這篇文章主要介紹了Java8-LocalDateTime極簡時間日期操作整理,通過實例代碼給大家介紹了java8 LocalDateTime 格式化問題,需要的朋友可以參考下
    2020-04-04
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的超詳細教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的超詳細教程

    這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • IDEA集成MyBatis Generator插件的使用

    IDEA集成MyBatis Generator插件的使用

    這篇文章主要介紹了IDEA集成MyBatis Generator插件的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論

灵武市| 惠州市| 灵石县| 庐江县| 浑源县| 黄平县| 桦川县| 祁阳县| 渭源县| 缙云县| 桂平市| 涪陵区| 天台县| 周宁县| 湖北省| 阳春市| 湄潭县| 商洛市| 宣武区| 临邑县| 庆元县| 上饶市| 茂名市| 宜黄县| 邵阳市| 菏泽市| 南汇区| 滦南县| 敦煌市| 屯昌县| 政和县| 康定县| 泗水县| 社会| 西贡区| 敖汉旗| 拜城县| 永善县| 布拖县| 剑河县| 凉城县|