【问题标题】:Spring boot with proguard not able to create executable jar带有proguard的Spring Boot无法创建可执行jar
【发布时间】:2016-06-23 13:20:54
【问题描述】:

在我的摇摆应用程序中,我使用了弹簧靴。在我使用带有 maven 插件的 proguard 来混淆我的 jar 之前,它工作得很好。现在,当我尝试启动我的应用程序“jar”时,它提供了我的错误。

我已经参考了这些问题

Spring Boot obfuscator

NullPointerException: ProGuard, Spring Boot

POM.xml

<build>
        <plugins>
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.0.6</version>
                <dependencies>
                    <dependency>
                        <groupId>net.sf.proguard</groupId>
                        <artifactId>proguard-base</artifactId>
                        <version>4.10</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <proguardVersion>4.10</proguardVersion>
                    <options>
                        <option>-keep public class com.mycompany.app.Main{public static void main(java.lang.String[]);}</option>
                        <option>-keep public class org.springframework.** { *; }</option>
                    </options>
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                    </libs>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
        <finalName>Application</finalName>
    </build>

控制台出错

[2016-06-23 18:39:00.110] boot - 240 ERROR [main] --- SpringApplication: Application startup failed
java.lang.IllegalStateException: Failed to execute CommandLineRunnerat org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:809)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:790)
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:777)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)
at com.mycompany.app.Main.main(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at com.mycompany.app.Main.run(Unknown Source)
at org.springframework.boot.SpringApplication.callRunner(SpringApplicati
on.java:806)
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.Invocat
ionTargetException
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:62)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54)... 1 more
Caused by: java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:809)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:790)
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:777)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)
at com.mycompany.app.Main.main(Unknown Source)        ... 6 more
Caused by: java.lang.NullPointerException
at com.mycompany.app.Main.run(Unknown Source)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:806)

【问题讨论】:

    标签: java spring-boot proguard executable-jar


    【解决方案1】:

    似乎缺少以下方法,因为它是由spring通过反射调用的:

    com.mycompany.app.Main.run(...)
    

    您需要使用如下规则明确保留它:

    -keep class com.mycompany.app.Main {
        *** run(...);
    }
    

    也许在那之后需要更多的保持规则。

    【讨论】:

    • 期望在参数号 108 中的 '(' 处打开 '{'
    • 刚刚测试了sn-p,它在语法上是正确的。您可以在配置的第 108 行发布内容吗?
    • 知道了,这是我的错误。工作正常。非常感谢朋友。
    猜你喜欢
    • 2020-07-25
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2018-07-21
    • 2017-02-04
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多