更新時(shí)間:2021-10-13 11:20:27 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1912次
在這個(gè)簡(jiǎn)短的教程中,我們將看到如何使用 Maven 從任何 Java 類(lèi)運(yùn)行任意main 方法。
假設(shè)我們有以下類(lèi):
public class Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(Exec.class);
public static void main(String[] args) {
LOGGER.info("Running the main method");
if (args.length > 0) {
LOGGER.info("List of arguments: {}", Arrays.toString(args));
}
}
}
我們想通過(guò) Maven 從命令行執(zhí)行它的 main 方法。
為了做到這一點(diǎn),我們可以使用 exec-maven-plugin。更具體地說(shuō),此插件的 exec:java 目標(biāo)執(zhí)行提供的 Java 類(lèi),并將封閉項(xiàng)目的依賴(lài)項(xiàng)作為類(lèi)路徑。
要執(zhí)行Exec類(lèi)的 main 方法,我們必須將類(lèi)的完全限定名稱(chēng)傳遞給插件:
$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec"
02:26:45.112 INFO com.baeldung.main.Exec - Running the main method
如上所示,我們使用 exec.mainClass 系統(tǒng)屬性來(lái)傳遞完全限定的類(lèi)名。
此外,在運(yùn)行 main 方法之前,我們必須確保類(lèi)路徑已準(zhǔn)備就緒。這就是我們?cè)趫?zhí)行 main 方法之前編譯源代碼的原因。
我們可以用普通的java 和 javac實(shí)現(xiàn)同樣的事情。 但是,當(dāng)我們使用相當(dāng)大的類(lèi)路徑時(shí),這可能會(huì)很麻煩。相反, 當(dāng)使用這個(gè)插件時(shí),Maven 會(huì)自動(dòng)處理填充類(lèi)路徑。
也可以將參數(shù)從命令行傳遞到 main 方法。為此,我們可以使用 exec.args 系統(tǒng)屬性:
$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" \
-Dexec.args="First Second"
02:31:08.235 INFO com.baeldung.main.Exec - Running the main method
02:31:08.236 INFO com.baeldung.main.Exec - List of arguments: [First, Second]
如上所示,我們傳遞了一個(gè)以空格分隔的參數(shù)列表。此外,我們可以通過(guò)exec.arguments 系統(tǒng)屬性使用逗號(hào)分隔的參數(shù)列表:
$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" \
-Dexec.arguments="Hello World,Bye"
02:32:25.616 INFO com.baeldung.main.Exec - Running the main method
02:32:25.618 INFO com.baeldung.main.Exec - List of arguments: [Hello World, Bye]
當(dāng)我們想在參數(shù)本身中使用分隔符(空格或逗號(hào))時(shí),這兩個(gè)選項(xiàng)非常有用。
我們還可以在pom.xml 中顯式聲明插件依賴(lài)項(xiàng) 。這樣,我們可以使用自定義和默認(rèn)配置。
例如,我們可以在插件的配置中指定一個(gè)默認(rèn)的主類(lèi):
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<mainClass>com.baeldung.main.Exec</mainClass>
</configuration>
</plugin>
</plugins>
</build>
現(xiàn)在,如果我們不指定所需類(lèi)的完全限定名稱(chēng),將使用com.baeldung.main.Exec :
$ mvn compile exec:java
02:33:14.197 INFO com.baeldung.main.Exec - Running the main method
但是,仍然可以通過(guò)顯式exec覆蓋此默認(rèn)配置。mainClass 系統(tǒng)屬性。
此外,我們還可以在配置中指定默認(rèn)程序參數(shù):
<configuration>
<mainClass>com.baeldung.main.Exec</mainClass>
<arguments>
<argument>First</argument>
<argument>Second</argument>
</arguments>
</configuration>
這樣我們就不需要在命令行上傳遞這些參數(shù):
$ mvn clean compile exec:java
02:34:24.448 INFO com.baeldung.main.Exec - Running the main method
02:34:24.450 INFO com.baeldung.main.Exec - List of arguments: [First, Second]
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)