2016-07-09 94 views
0

我在jar文件中有應用程序。我試圖用ProGuard來模仿它。在我的ProGuard配置文件我已經加入:使用ProGuard後,jar無法運行

-keep public class forms.Login{ 
    public static void main(java.lang.String[]); 
} 

後obfustication映射文件顯示:forms.Login - > forms.Login:...無效的主要(java.lang.String中[]) - >主.. 。

我跑我的應用程序java命令pathToObfusticatedJar.jar forms.Login,但我得到的錯誤:

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 52 
Exception Details: 
    Location: 
    forms/Login.main([Ljava/lang/String;)V @0: invokestatic 
    Reason: 
    Expected stackmap frame at this location. 
    Bytecode: 
    0x0000000: b800 904c 2bbe 3d03 3e1d 1ca2 0026 2b1d 
    0x0000010: 323a 0412 0619 04b6 0093 b600 6499 000e 
    0x0000020: 1904 b600 92b8 0091 a700 0984 0301 a7ff 
    0x0000030: dba7 0050 4c12 0db6 0061 b800 68b2 003f 
    0x0000040: 012b b600 69a7 003c 4c12 0db6 0061 b800 
    0x0000050: 68b2 003f 012b b600 69a7 0028 4c12 0db6 
    0x0000060: 0061 b800 68b2 003f 012b b600 69a7 0014 
    0x0000070: 4c12 0db6 0061 b800 68b2 003f 012b b600 
    0x0000080: 69bb 0013 59b7 005a b800 5fb1 
    Exception Handler Table: 
    bci [0, 49] => handler: 52 
    bci [0, 49] => handler: 72 
    bci [0, 49] => handler: 92 
    bci [0, 49] => handler: 112 

     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
     at java.lang.Class.privateGetMethodRecursive(Unknown Source) 
     at java.lang.Class.getMethod0(Unknown Source) 
     at java.lang.Class.getMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 

可能有人會這麼好心來解釋什麼,我做錯了什麼?我是否必須更改proguard配置或以某種方式在cmd中設置主要方法? 另外,我相信我已經設定保留我的公共靜態void main方法,但是Proguard會對它進行修改。爲什麼?如何讓它保持不變?

+0

只是不要。財富100強企業也不會混淆他們的JAR。 – wilx

+0

我想以某種方式保護我的應用程序,因爲它的登錄名和密碼都在我的遠程數據庫中。我使用休眠配置,並在應用程序中有hibernate.connection.username和hibernate.connection.password。 – JavaNewbie

+0

如果你需要在你的代碼中存儲用戶名和密碼,那麼你做錯了。讓應用程序用戶在網頁上進行身份驗證,並生成用戶使用的某種令牌,而不是用戶名和密碼。通過一些Web API而不是直接將數據傳輸到數據庫中。 – wilx

回答

1

看起來您已經禁用了preverification,這在Java 7+上運行Java應用程序時是必需的。

檢查您的配置並刪除-dontpreverify