Quantcast
Channel: iT邦幫忙
Viewing all articles
Browse latest Browse all 15645

JRE 瘦身, 找出 jar 檔中有用到的 class

$
0
0
請問有人有幫 JRE 瘦身的經驗嗎?
我目前遇到的情況如下:
1. 如果只是單純的 Console Application, JRE 瘦身之後使用正常!
2. 如果是有 GUI 的 Application, JRE 瘦身之後都會遇到 Exception
例如:
Exception in thread "main" java.lang.NoClassDefFoundError: java/lang/NoSuchMethodException
	at javax.swing.UIDefaults.getUI(Unknown Source)
	at javax.swing.UIManager.getUI(Unknown Source)
	at javax.swing.JPanel.updateUI(Unknown Source)
	at javax.swing.JPanel.<init>(Unknown Source)
	at javax.swing.JPanel.<init>(Unknown Source)
	at javax.swing.JPanel.<init>(Unknown Source)
	at javax.swing.JRootPane.createGlassPane(Unknown Source)
	at javax.swing.JRootPane.<init>(Unknown Source)
	at javax.swing.JFrame.createRootPane(Unknown Source)
	at javax.swing.JFrame.frameInit(Unknown Source)
	at javax.swing.JFrame.<init>(Unknown Source)
	at Main.main(Main.java:11)

可是此時我將 javax.swing.* 全部在包進 rt.jar 裡面,這個 exception 仍然不會消失!Orz

我的操作過程如下:
1. 使用 command 執行我的 jar
java -jar -verbose:class MyProgram.jar > usedClassList.txt 

2. 將有用到的 jar 解壓縮(如 rt.jar, charsets.jar 解壓縮到相對應的目錄下)
2. 將 usedClassList.txt 裡有用到的 class 重新打包成 rt.jar 或 charsets.jar 或...等等.
3. 將各個 jar 檔裡的 META-INF 複製到相對應的目錄下. (如 rt\META-INF -> rt_slim\META-INF )
4. 使用 jar -cvf 重新將瘦身過的 class 重新打包成 jar 檔

以上步驟在對於瘦身後的 charsets.jar 是可以正常 work 的,可是對於 rt.jar 就一直有問題.但 console program 就沒問題。我在想是不是有某些用到的 class 我沒有包進去呢?

問題:
1. 要如何確定我有把所有用到的 class 都包進去瘦身過後的 jar 檔呢?
2. 除了使用
 java -jar -verbose:class myProgram.jar > list.txt 

還有沒有其他的方法可以得知我會用到那些 class

感謝各位前輩的幫忙~~~這問題卡好久了哭

Viewing all articles
Browse latest Browse all 15645

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>