首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Maven 打包實戰:配置 pom.xml 生成標準部署結構 (lib/conf/bin) 並編寫啟動腳本

     編輯:Java 相關知識

前言:為什麼需要標準化部署結構?

專案從開發到生產部署,常面臨「Jar 包散落、配置檔混雜、啟動命令複雜」的問題。Maven 作為構建標準化利器,透過精心配置 pom.xml,可一鍵生成業界通用的部署目錄結構:

target/ ├─ lib/          ← 所有依賴 Jar + 專案自身 Jar + 源碼 Jar ├─ conf/         ← 所有配置檔 (從 src/main/resources 複製) └─ bin/          ← 啟動腳本 (.sh/.bat)

本文提供完整可用的 pom.xml 配置解析,並附上跨平台啟動腳本範例,助你實現「開發即部署、零手工整理」。


完整 pom.xml 核心配置 (build 區塊)

<build> <sourceDirectory>src/main/java</sourceDirectory> <resources> <!-- 1. 配置檔 → conf/ --> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}/conf</targetPath> </resource> <!-- 2. 本地 lib 目錄 Jar → lib/ (Maven 找不到的第三方 Jar) --> <resource> <directory>lib</directory> <targetPath>${project.build.directory}/lib</targetPath> </resource> <!-- 3. 根目錄啟動腳本 → bin/ --> <resource> <directory>.</directory> <includes> <include>**/*.sh</include> <include>**/*.bat</include> </includes> <targetPath>${project.build.directory}/bin</targetPath> </resource> </resources> <plugins> <!-- 編譯插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> <fork>true</fork> <defaultLibBundleDir>lib</defaultLibBundleDir> <!-- 指定 javac 路徑 (可選,若已設 JAVA_HOME 可省略) --> <executable>C:/Program Files/Java/jdk1.8.0_91/bin/javac.exe</executable> </configuration> </plugin> <!-- 打包 Jar 插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!-- 主類別由啟動腳本指定,此處可不配置 Main-Class --> </manifest> </archive> <excludes> <exclude>*.xml</exclude> <exclude>*.properties</exclude> <!-- 排除配置檔,避免進 Jar,統一放 conf/ --> </excludes> </configuration> </plugin> <!-- 依賴複製插件:將所有 Maven 依賴複製到 lib/ --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals><goal>copy-dependencies</goal></goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> <!-- 資源複製插件 (編碼處理) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration><encoding>UTF-8</encoding></configuration> </plugin> <!-- 源碼打包插件 (可選,方便除錯) --> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> <executions> <execution> <phase>compile</phase> <goals><goal>jar</goal></goals> </execution> </executions> </plugin> </plugins> </build>

關鍵配置逐行解析

插件/區塊核心作用關鍵參數
resources定義非 Java 檔案輸出路徑targetPath 指向 ${project.build.directory}/conf|lib|bin
maven-compiler-plugin編譯原始碼defaultLibBundleDir=lib 讓 Manifest Class-Path 指向 lib/
maven-jar-plugin打包專案 JaroutputDirectory=target/lib、excludes 排除配置檔
maven-dependency-plugin複製傳遞依賴goal=copy-dependencies、outputDirectory=target/lib
maven-source-plugin打包源碼 Jar同輸出至 lib/,IDE 可自動關聯源碼除錯

執行打包命令

# 命令列 mvn clean package # Eclipse 右鍵專案 → Run As → Maven Build → Goals 輸入 package → Run # IDEA Maven 面板 → Lifecycle → package

執行成功後,target/ 目錄將呈現預期結構。


跨平台啟動腳本範例

Windows: bin/start.bat

@ECHO OFF REM 設定 CLASSPATH 包含 conf 目錄 set CLASSPATH=%JAVA_HOME%\lib;..\conf REM 使用 java.ext.dirs 自動載入 lib/ 所有 Jar set JAVA=%JAVA_HOME%\bin\java set JAVA_OPTIONS=-Djava.ext.dirs="..\lib" "%JAVA%" -Xms512m -Xmx1024m -classpath "%CLASSPATH%" %JAVA_OPTIONS% com.yourcompany.MainClass

Linux/Mac: bin/start.sh

#!/bin/bash # 解決相對路徑問題 BASE_DIR=$(cd "$(dirname "$0")/.." && pwd) CLASSPATH="$JAVA_HOME/lib:$BASE_DIR/conf" JAVA_OPTS="-Djava.ext.dirs=$BASE_DIR/lib -Xms512m -Xmx1024m" exec "$JAVA_HOME/bin/java" $JAVA_OPTS -classpath "$CLASSPATH" com.yourcompany.MainClass

腳本關鍵點說明

  • -Djava.ext.dirs=../lib:JVM 擴展類加載器自動載入目錄下所有 Jar,無需在 Class-Path 逐一列舉,極大簡化維護。
  • CLASSPATH 僅包含 conf/,確保配置檔優先被應用類加載器讀取 (如 log4j.properties, application.yml)。
  • -Xms/-Xmx:根據伺服器記憶體調整,建議預留 1-2GB 給 OS/緩存。
  • 腳本放專案根目錄 *.sh/*.bat,Maven resources 區塊會自動複製至 target/bin/。

進階技巧與常見問題

1. 排除特定傳遞依賴 (避免衝突)

<plugin> <artifactId>maven-dependency-plugin</artifactId> <configuration> <excludeArtifactIds>log4j,slf4j-log4j12</excludeArtifactIds> <!-- 排除舊版 logging --> </configuration> </plugin>

2. 生產環境分 Profile 打包

<profiles> <profile> <id>prod</id> <build> <resources> <resource> <directory>src/main/resources-prod</directory> <targetPath>${project.build.directory}/conf</targetPath> </resource> </resources> </build> </profile> </profiles> # 打包命令 mvn clean package -Pprod

3. 執行權限問題

# Linux 需賦予執行權限 chmod +x target/bin/start.sh

4. 模組化專案打包

多模組專案建議在父 pom 統一 dependencyManagement,子模組各自配置上述 build 區塊,或使用 maven-assembly-plugin 組裝統一發布包。


總結

透過 Maven 標準化打包配置,你獲得:
✅ 零手工整理:mvn package 一鍵產出標準部署包
✅ 配置外部化:conf/ 獨立管理,環境差異化無侵入代碼
✅ 依賴集中化:lib/ 扁平化,java.ext.dirs 零維護 Class-Path
✅ 腳本跨平台:.sh/.bat 同源,運維標準化
建議將此 pom.xml 模板納入團隊脚手架,新專案開箱即用,消除「在我機器上能跑」的部署差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved