直接執行程式

在上一節建立可執行Jar檔是不是奇怪經常看到

  <properties>
    <exec.mainClass>完整類別名稱(有main方法的class)</exec.mainClass>
  <properties>

這是因為變數 exec.mainClass恰是 exec-maven-plugin的Goal:exec:java的參數

當我們執行 mvn compile exec:java 時,專案就會立即編譯後立即執行指定的 class(當然,如前執行前已編譯過,可以直接執行 mvn exec:java)

(註:之前外掛一節提過前置字的解析,讓Maven知道exec要使用何種外掛。)

當然,如需額外設定(例如加系統變數),就必須在pom.xml內自行設定

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>3.1.1</version>
  <configuration>
    <cleanupDaemonThreads>false</cleanupDaemonThreads>
    <systemProperties>
      <systemProperty>
        <key>db2.jcc.charsetDecoderEncoder</key>
        <value>3</value>
      </systemProperty>
    </systemProperties>
  </configuration>
</plugin>

(註:每種外掛設定系統變數的方式不儘相同,一定要看文件)

除了上述的方式,也有另一種設定(要自行設定)可以讓程式直接執行

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>3.1.1</version>
  <configuration>
    <executable>java</executable>
    <arguments>
      <argument>-classpath</argument>
      <classpath />
      <argument>${exec.mainClass}</argument>
    </arguments>
  </configuration>
</plugin>

完成設定後,改為執行 mvn compile exec:exec,跟先前不同的是,先前整個流程都在同一個Jvm裡面完成,而此次則是叫用java來執行程式,所以同時會有2個JVM存在。

這樣的好處是可以額外加參數,例如使用JDK9以後的 module設定,就必須自行加入像--module-path--module這樣的參數。

前述講的都是Jar,但如果我開發的是Web程式呢?

其實只要引用 jetty-maven-plugin 就可以了。

  <plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>11.0.20</version><!--如果是JDK8請改用9.x版-->
    <configuration>
      <webApp>
        <!--下行若不加,則會以 Root 執行-->
        <contextPath>/${project.artifactId}</contextPath>
        <!--在目錄架構一節我有提過,為了過濾web.xml,我把web.xml換了位置, 如果沒換位置下行不用加-->
        <descriptor>${project.build.testOutputDirectory}/web.xml</descriptor>
      </webApp>
      <httpConnector><!--預設就是8080,可以不用加-->
          <port>8080</port>
      </httpConnector>
      <stopKey>HALT</stopKey><!--這兩行用於執行 jetty:stop 停止,不一定要用-->
      <stopPort>9966</stopPort>
    </configuration>
  </plugin>

我們先建立一個Web專案

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \
  -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4 \
  -DarchetypeCatalog=https://repo.maven.apache.org/maven2/archetype-catalog.xml

然後搬動web.xml,再把jetty-maven-plugin加入pom.xml, 然後執行

mvn jetty:run

然後開啟 http://localhost:8080/就可以看到運行的web了。