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 一般來說不需要簽名就是了.
參考
- https://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html
- https://maven.apache.org/plugins/maven-jar-plugin/
- https://maven.apache.org/plugins/maven-jarsigner-plugin/
- https://stackoverflow.com/questions/2027753/how-to-deploy-applet-with-dependencies-jar-using-maven-and-sign-it