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

SpringBoot JAR和WAR方式打包并部署的詳細(xì)步驟及對比分析

 更新時間:2026年01月07日 08:44:33   作者:悟空碼字  
無論選擇JAR還是WAR部署方式,關(guān)鍵在于匹配團隊的技術(shù)棧、運維能力和業(yè)務(wù)需求,Spring Boot的靈活性支持兩種部署模式,為不同場景提供了合適的解決方案,本文給大家詳細(xì)對比分析了這兩種方式,需要的朋友可以參考下

一、JAR 和 WAR 打包的區(qū)別

JAR (Java ARchive)

  • 獨立運行:內(nèi)嵌Tomcat/Jetty服務(wù)器,可直接通過 java -jar 運行
  • 微服務(wù)友好:適合云原生、容器化部署
  • 簡化部署:單個可執(zhí)行文件,無需外部Web服務(wù)器
  • 默認(rèn)方式:Spring Boot 默認(rèn)打包為可執(zhí)行JAR

WAR (Web Application ARchive)

  • 傳統(tǒng)部署:需要外部Servlet容器(如Tomcat、WebLogic)
  • 企業(yè)環(huán)境:適合需要部署到現(xiàn)有應(yīng)用服務(wù)器的場景
  • 共享資源:多個應(yīng)用可共享服務(wù)器資源
  • 配置分離:服務(wù)器配置與應(yīng)用分離

二、詳細(xì)打包部署步驟

項目結(jié)構(gòu)

my-springboot-app/
├── src/
│   └── main/
│       ├── java/com/example/
│       └── resources/
└── pom.xml 或 build.gradle

1. 打包為可執(zhí)行JAR(默認(rèn)方式)

Maven 配置 (pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>my-springboot-app</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>  <!-- 打包為JAR -->
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.5</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <!-- Spring Boot Maven 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.example.MyApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Gradle 配置 (build.gradle)

plugins {
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.3'
    id 'java'
}

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

jar {
    enabled = true
    archiveClassifier = ''  // 移除plain后綴
}

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

// 可執(zhí)行JAR配置
bootJar {
    mainClass = 'com.example.MyApplication'
    archiveClassifier = ''
}

主啟動類

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

打包命令

# Maven
mvn clean package

# Gradle
./gradlew clean build

運行JAR

# 直接運行
java -jar target/my-springboot-app-1.0.0.jar

# 指定配置文件
java -jar target/my-springboot-app-1.0.0.jar \
  --spring.config.location=classpath:/,file:./config/

# 指定端口
java -jar target/my-springboot-app-1.0.0.jar \
  --server.port=8081

# 生產(chǎn)環(huán)境運行(內(nèi)存優(yōu)化)
java -Xms512m -Xmx1024m -jar target/my-springboot-app-1.0.0.jar \
  --spring.profiles.active=prod

2. 打包為WAR(用于外部容器)

修改Maven配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>my-springboot-app</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>  <!-- 修改為WAR -->
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.5</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除內(nèi)嵌Tomcat -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!-- 添加Servlet API依賴(provided scope) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>  <!-- 由外部容器提供 -->
        </dependency>
    </dependencies>
    
    <build>
        <finalName>myapp</finalName>  <!-- WAR文件名稱 -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

修改啟動類

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(MyApplication.class);
    }
    
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

Gradle WAR配置

plugins {
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.3'
    id 'java'
    id 'war'  // 添加war插件
}

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

configurations {
    providedRuntime  // 用于provided范圍的依賴
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

war {
    archiveFileName = 'myapp.war'
}

打包WAR

# Maven
mvn clean package

# Gradle
./gradlew clean build

部署到外部Tomcat

準(zhǔn)備Tomcat服務(wù)器

# 下載Tomcat
wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.13/bin/apache-tomcat-10.1.13.tar.gz
tar -xzf apache-tomcat-10.1.13.tar.gz
cd apache-tomcat-10.1.13

部署WAR文件

# 復(fù)制WAR文件到webapps目錄
cp target/myapp.war /opt/tomcat/webapps/

# 或者使用管理界面部署
# 訪問 http://localhost:8080/manager/html

Tomcat配置優(yōu)化(conf/server.xml)

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="200"
           minSpareThreads="10"
           enableLookups="false"
           acceptCount="100"
           disableUploadTimeout="true"/>

啟動/停止Tomcat

# Linux
./bin/startup.sh
./bin/shutdown.sh

# Windows
bin\startup.bat
bin\shutdown.bat

3. 配置文件管理

application.yml 示例

# 公共配置
spring:
  application:
    name: my-springboot-app

# 開發(fā)環(huán)境
---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8080
logging:
  level:
    root: DEBUG

# 生產(chǎn)環(huán)境
---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 8080
  compression:
    enabled: true
    mime-types: text/html,text/xml,text/plain,application/json
logging:
  file:
    name: /var/log/myapp.log
  level:
    root: INFO

4. 容器化部署(Docker)

Dockerfile for JAR

# 使用多階段構(gòu)建
FROM eclipse-temurin:17-jdk-alpine as builder
WORKDIR /app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
RUN ./mvnw dependency:go-offline
COPY src ./src
RUN ./mvnw clean package -DskipTests

# 運行階段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Dockerfile for WAR + Tomcat

FROM tomcat:10.1-jdk17-temurin
# 移除默認(rèn)應(yīng)用
RUN rm -rf /usr/local/tomcat/webapps/*
# 復(fù)制WAR文件
COPY target/myapp.war /usr/local/tomcat/webapps/ROOT.war
# 暴露端口
EXPOSE 8080
# 啟動Tomcat
CMD ["catalina.sh", "run"]

Docker Compose 示例

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - DB_HOST=mysql
    depends_on:
      - mysql
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=mydb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:

三、部署腳本示例

Linux 服務(wù)腳本(systemd)

# /etc/systemd/system/myapp.service
[Unit]
Description=My Spring Boot Application
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar myapp.jar
SuccessExitStatus=143
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

部署腳本

#!/bin/bash
# deploy.sh

APP_NAME="my-springboot-app"
JAR_PATH="target/$APP_NAME-1.0.0.jar"
DEPLOY_DIR="/opt/$APP_NAME"
BACKUP_DIR="$DEPLOY_DIR/backup"
LOG_DIR="/var/log/$APP_NAME"

# 創(chuàng)建目錄
mkdir -p $DEPLOY_DIR $BACKUP_DIR $LOG_DIR

# 備份舊版本
if [ -f "$DEPLOY_DIR/$APP_NAME.jar" ]; then
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    mv "$DEPLOY_DIR/$APP_NAME.jar" "$BACKUP_DIR/$APP_NAME-$TIMESTAMP.jar"
fi

# 復(fù)制新版本
cp $JAR_PATH "$DEPLOY_DIR/$APP_NAME.jar"

# 設(shè)置權(quán)限
chmod 755 "$DEPLOY_DIR/$APP_NAME.jar"

# 重啟服務(wù)
systemctl restart $APP_NAME

# 檢查狀態(tài)
sleep 10
systemctl status $APP_NAME

四、總結(jié)對比

特性JAR 部署WAR 部署
部署方式獨立運行,內(nèi)嵌容器依賴外部Servlet容器
啟動命令java -jar app.jar容器啟動(如Tomcat)
適合場景微服務(wù)、云原生、容器化傳統(tǒng)企業(yè)環(huán)境、共享服務(wù)器
依賴管理包含所有依賴(fat jar)部分依賴由容器提供
資源占用每個應(yīng)用獨立容器多個應(yīng)用共享容器資源
熱部署需要重啟整個應(yīng)用Tomcat支持部分熱部署
配置管理應(yīng)用自身管理可與容器配置結(jié)合
監(jiān)控Spring Boot Actuator容器管理界面 + Actuator

選擇建議:

  1. 選擇JAR的情況
    • 微服務(wù)架構(gòu)
    • 容器化部署(Docker/K8s)
    • 云原生應(yīng)用
    • 需要快速獨立部署
    • 無現(xiàn)有應(yīng)用服務(wù)器
  2. 選擇WAR的情況
    • 傳統(tǒng)企業(yè)IT環(huán)境
    • 已有Tomcat/WebLogic集群
    • 需要與其他Java EE應(yīng)用共享資源
    • 運維團隊熟悉傳統(tǒng)部署模式
    • 需要與舊系統(tǒng)集成

最佳實踐:

  1. 對于新項目,優(yōu)先考慮JAR部署,更符合現(xiàn)代架構(gòu)
  2. 統(tǒng)一配置管理:無論JAR/WAR,使用外部配置文件
  3. 健康檢查:集成Spring Boot Actuator用于監(jiān)控
  4. 日志集中:使用Logback/SLF4J,日志輸出到文件或日志系統(tǒng)
  5. 安全加固:生產(chǎn)環(huán)境關(guān)閉開發(fā)特性,使用HTTPS
  6. 自動化部署:結(jié)合CI/CD流水線實現(xiàn)自動化

通過合理的打包部署策略,可以確保Spring Boot應(yīng)用在不同環(huán)境中的穩(wěn)定運行和高效維護。

以上就是SpringBoot JAR和WAR方式打包并部署的詳細(xì)步驟及對比分析的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot JAR和WAR方式打包部署的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Minio的使用教程

    Minio的使用教程

    Minio是一個開源的對象存儲服務(wù),兼容Amazon?S3接口,適合存儲大容量非結(jié)構(gòu)化數(shù)據(jù),它部署簡單,支持海量存儲和分布式部署,通過配置文件和systemd服務(wù),可以輕松設(shè)置和管理Minio服務(wù),本文介紹Minio的使用教程,感興趣的朋友一起看看吧
    2025-02-02
  • Java實現(xiàn)分頁查詢功能

    Java實現(xiàn)分頁查詢功能

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)分頁查詢功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Spring深入刨析聲明式事務(wù)注解的源碼

    Spring深入刨析聲明式事務(wù)注解的源碼

    在spring注解中,使用聲明式事務(wù),需要用到兩個核心的注解:@Transactional注解和@EnableTransactionManagement注解。將@Transactional注解加在方法上,@EnableTransactionManagement注解加在配置類上
    2022-07-07
  • Java虛擬機性能優(yōu)化技巧和最佳實踐分享

    Java虛擬機性能優(yōu)化技巧和最佳實踐分享

    Java虛擬機(JVM)是Java平臺的核心組件,負(fù)責(zé)將Java字節(jié)碼轉(zhuǎn)換為機器碼并執(zhí)行,JVM性能直接影響Java應(yīng)用的響應(yīng)速度、吞吐量和資源利用率,本文將深入探討JVM性能優(yōu)化的關(guān)鍵技術(shù)和最佳實踐,幫助開發(fā)者和運維人員提升Java應(yīng)用性能,需要的朋友可以參考下
    2025-05-05
  • Spring Cache實現(xiàn)緩存技術(shù)

    Spring Cache實現(xiàn)緩存技術(shù)

    在面對公司緩存技術(shù)混亂時,張三基于Spring框架自研緩存解決方案,展現(xiàn)了他的專業(yè)技術(shù)能力和積極工作態(tài)度,他通過問題診斷、技術(shù)選型、編碼測試、文檔編寫和部署監(jiān)控等一系列步驟,確保了新緩存系統(tǒng)的功能正確性和性能穩(wěn)定性
    2024-10-10
  • SpringMVC教程之文件上傳與下載詳解

    SpringMVC教程之文件上傳與下載詳解

    本文將對使用MultipartResolver處理文件上傳的步驟,兩種文件下載方式(直接向response的輸出流中寫入對應(yīng)的文件流、使用 ResponseEntity<byte[]>來向前端返回文件)等進行詳盡介紹,需要的可以參考一下
    2022-12-12
  • javaweb實現(xiàn)app掃碼登錄功能

    javaweb實現(xiàn)app掃碼登錄功能

    這篇文章主要為大家詳細(xì)介紹了javaweb實現(xiàn)app掃碼登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • SpringBoot接收form-data和x-www-form-urlencoded數(shù)據(jù)的方法

    SpringBoot接收form-data和x-www-form-urlencoded數(shù)據(jù)的方法

    form-data和x-www-form-urlencoded是兩種不同的HTTP請求體格式,本文主要介紹了SpringBoot接收form-data和x-www-form-urlencoded數(shù)據(jù)的方法,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • java對象序列化與反序列化的默認(rèn)格式和json格式使用示例

    java對象序列化與反序列化的默認(rèn)格式和json格式使用示例

    這篇文章主要介紹了java對象序列化與反序列化的默認(rèn)格式和json格式使用示例,需要的朋友可以參考下
    2014-02-02
  • Java中wait()與sleep()兩者的不同深入解析

    Java中wait()與sleep()兩者的不同深入解析

    在Java多線程編程中,wait()和sleep()是控制線程執(zhí)行和等待的兩個關(guān)鍵方法,但它們在應(yīng)用場景和實現(xiàn)上有顯著差異,這篇文章主要介紹了Java中wait()與sleep()兩者的不同,需要的朋友可以參考下
    2024-11-11

最新評論

武威市| 高唐县| 尉氏县| 固镇县| 云霄县| 张家港市| 牙克石市| 涞水县| 江安县| 镶黄旗| 八宿县| 禹州市| 绥芬河市| 镇远县| 南阳市| 林周县| 威信县| 虎林市| 昭苏县| 六枝特区| 纳雍县| 梧州市| 招远市| 吉隆县| 三江| 吉木乃县| 铜川市| 江城| 商南县| 武安市| 泸州市| 元朗区| 独山县| 腾冲县| 邵东县| 祁东县| 来宾市| 收藏| 论坛| 余干县| 察隅县|