專案從開發到生產部署,常面臨「Jar 包散落、配置檔混雜、啟動命令複雜」的問題。Maven 作為構建標準化利器,透過精心配置 pom.xml,可一鍵生成業界通用的部署目錄結構:
target/ ├─ lib/ ← 所有依賴 Jar + 專案自身 Jar + 源碼 Jar ├─ conf/ ← 所有配置檔 (從 src/main/resources 複製) └─ bin/ ← 啟動腳本 (.sh/.bat) 本文提供完整可用的 pom.xml 配置解析,並附上跨平台啟動腳本範例,助你實現「開發即部署、零手工整理」。
<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 | 打包專案 Jar | outputDirectory=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/ 目錄將呈現預期結構。
@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 #!/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/。<plugin> <artifactId>maven-dependency-plugin</artifactId> <configuration> <excludeArtifactIds>log4j,slf4j-log4j12</excludeArtifactIds> <!-- 排除舊版 logging --> </configuration> </plugin> <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 # Linux 需賦予執行權限 chmod +x target/bin/start.sh 多模組專案建議在父 pom 統一 dependencyManagement,子模組各自配置上述 build 區塊,或使用 maven-assembly-plugin 組裝統一發布包。
透過 Maven 標準化打包配置,你獲得:
✅ 零手工整理:mvn package 一鍵產出標準部署包
✅ 配置外部化:conf/ 獨立管理,環境差異化無侵入代碼
✅ 依賴集中化:lib/ 扁平化,java.ext.dirs 零維護 Class-Path
✅ 腳本跨平台:.sh/.bat 同源,運維標準化
建議將此 pom.xml 模板納入團隊脚手架,新專案開箱即用,消除「在我機器上能跑」的部署差異。