Maven 1 - 打包 Jar, Applet 並簽名 Sign

Maven 1 - 打包 Jar, Applet 並簽名 Sign','Applet 程式在 package 時有兩個重點, 一是要把所有用到的 jar 程式庫都包在一起, 因為 applet 不像 ear 或 war 有固定目錄可以放 *.jar. 二是如果需要用到 browser 機器的一些資源 (如印表機), 則必須經過簽名.

以下是要把 Applet 程式打包的寫法, 幾個重點:

  • descriptorRef 使用 jar-with-dependencies: 會把用到的 class 都一起打包進最後的 jar 檔. 預設會打包到另一個檔案, 原來的名字如果是 app-client-1.0.jar, 則會打包成 app-client-1.0-jar-with-dependencies.jar
  • appendAssemblyId 設成 false, 這樣產生出來的 jar 檔案名稱才不會有 -with-dependencies 的字
  • phase 請指定 package, 這樣才會把需要的 class 都打包進去
  • goal 請使用 assembly:single (不指定也可以, 有 package 也會執行到這裡)
  • 注意, maven-assembly-plugin 一定要用 2.2-beta-5, 用 2.2 或 2.2.1 都會有問題 (這感覺不太合理, 不過測試結果目前就是這樣, 或許是我哪裡弄錯了)
 1<pre class="brush: xml" title="Client 的 pom.xml (打包用)">
 2  <build>
 3    <plugins>
 4      <plugin>
 5        <groupid>org.apache.maven.plugins</groupid>
 6        <artifactid>maven-compiler-plugin</artifactid>
 7        <version>2.3.2</version>
 8        <configuration>
 9          <source></source>1.6
10          <target>1.6</target>
11        </configuration>
12      </plugin>
13      <plugin>
14        <artifactid>maven-assembly-plugin</artifactid>
15        <version>2.2-beta-5</version>
16        <configuration>
17          <descriptorrefs>
18            <descriptorref>jar-with-dependencies</descriptorref>
19          </descriptorrefs>
20          <finalname>${project.build.finalName}</finalname>
21          <appendassemblyid>false</appendassemblyid>
22          <archive>
23            <index>true</index>
24            <manifest>
25              <adddefaultimplementationentries>true</adddefaultimplementationentries>
26            </manifest>
27          </archive>
28        </configuration>
29        <executions>
30          <execution>
31            <phase>package</phase>
32            <goals>
33              <goal>single</goal>
34            </goals>
35          </execution>
36        </executions>
37      </plugin>
38    </plugins>
39  </build>

簽名的部分, 使用 maven-jarsigner-plugin 來做簽名即可.

 1      <plugin>
 2        <groupid>org.apache.maven.plugins</groupid>
 3        <artifactid>maven-jarsigner-plugin</artifactid>
 4        <version>1.2</version>
 5        <executions>
 6          <execution>
 7            <id>sign</id>
 8            <goals>
 9              <goal>sign</goal>
10            </goals>
11          </execution>
12        </executions>
13        <configuration>
14          <keystore>${basedir}\\key\\xxxx.store</keystore>
15          <alias>xxxxkey</alias>
16          <storepass>yourpassword</storepass>
17        </configuration>
18      </plugin>

實際上他會呼叫 jarsigner.exe 來做簽名的動作, 可以在 console 看到 log如下 (因為是 debug level, 所以要把 Maven 開到 debug mode 才看得到)```

[debug] Executing: cmd.exe /X /C \"...\\jarsigner.exe -verify ...\\app-client-1.0.jar\"

另外, 也可以使用 maven-jar-plugin, 效果和 maven-jarsigner-plugin 是一樣的. 但是在 jar-plugin 2.3 以後, jar:sign 已經不被建議使用, 請改用 jarsigner-plugin. 比較特別的是, jar-plugin 可以指定 signedjar 把簽名過的檔案放到其他目錄, 而 jarsigner-plugin 似乎沒有這個功能.

 1      <plugin>
 2        <groupid>org.apache.maven.plugins</groupid>
 3        <artifactid>maven-jar-plugin</artifactid>
 4        <version>2.3.1</version>
 5        <executions>
 6          <execution>
 7            <goals>
 8              <goal>sign</goal>
 9            </goals>
10          </execution>
11        </executions>
12        <configuration>
13          <keystore>${basedir}\\key\\xxxx.store</keystore>
14          <alias>xxxxkey</alias>
15          <storepass>yourpassword</storepass>
16          
17          <verify>true</verify>
18        </configuration>
19      </plugin>

喔, 講了那麼多, 都沒有提到 Jar... 其實 Applet 就是一個 Jar, 所以用上面 Applet 的方式就可以了. 差別在於 Jar 一般來說不需要簽名就是了.

參考

Reference for assembly for standalone jar