Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Lambda表达式的Proguard Maven掩蔽错误_Java_Maven_Lambda_Proguard - Fatal编程技术网

Java 使用Lambda表达式的Proguard Maven掩蔽错误

Java 使用Lambda表达式的Proguard Maven掩蔽错误,java,maven,lambda,proguard,Java,Maven,Lambda,Proguard,我使用Proguard和Maven来屏蔽我的Java代码 我将所有函数从匿名声明更改为Lambda expression0,但在编译和运行之后,我得到了错误消息 2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] - Exception in thread "AWT-EventQueue-0" 2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] - java.lang.BootstrapMethod

我使用Proguard和Maven来屏蔽我的Java代码

我将所有函数从匿名声明更改为Lambda expression0,但在编译和运行之后,我得到了错误消息

2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] - Exception in thread "AWT-EventQueue-0" 
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] - java.lang.BootstrapMethodError: call site initialization exception
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.lang.invoke.CallSite.makeSite(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.lang.invoke.MethodHandleNatives.linkCallSite(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at com.goodsoft.stockbox.chart.f.c.h.a(ChartWindowPanel.java:50208)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at com.goodsoft.stockbox.commons.f.h.a.b.n(BaseWindowController.java:269)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at com.goodsoft.stockbox.commons.f.h.a.b.a(BaseWindowController.java:30)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at com.goodsoft.stockbox.commons.f.h.a.b$1.m(BaseWindowController.java:164)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at com.goodsoft.stockbox.commons.b.c.d$3.c(InstrumentController.java:324)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.event.InvocationEvent.dispatch(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventQueue.access$500(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventQueue$3.run(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventQueue$3.run(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.security.AccessController.doPrivileged(Native Method)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventQueue.dispatchEvent(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
2017-sty-20 08:53:46,289 ERROR [AWT-EventQueue-0] -     at java.awt.EventDispatchThread.run(Unknown Source)
2017-sty-20 08:53:46,305 ERROR [AWT-EventQueue-0] - Caused by: java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 1: class com.goodsoft.stockbox.commons.model.c is not convertible to int
2017-sty-20 08:53:46,305 ERROR [AWT-EventQueue-0] -     at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(Unknown Source)
有趣的错误日志是:

Caused by: java.lang.invoke.LambdaConversionException: Type mismatch for lambda argument 1: class com.goodsoft.stockbox.commons.model.c is not convertible to int
。。。所以也许lambda没有问题,但是lambda使用的遮罩对象

更改为lambda之前的方法(效果良好):

。。。和更改为Lambda表达式后的(不起作用):

其名称为:

int newValue = computeBidAskDifference();
ValueChangeType type = previousValue > newValue ? ValueChangeType.DROP :
        previousValue < newValue ? ValueChangeType.GROWTH : ValueChangeType.EQUAL;

if (delegate != null)
    delegate.valueChanged(newValue, type);
编辑


我尝试将maven选项添加为
-优化!方法/删除/参数
-优化!方法/标记/静态
但没有帮助。

已解决

将枚举更改为整数存在优化问题

只需关闭此优化,即可正常工作

<option>-optimizations !class/unboxing/enum</option>
-优化!类/取消装箱/枚举

我认为没有“-donttrashmylambdas”选项。如果Proguard意识到代码转换与lambda使用不兼容,那么它不会进行转换。如果不进一步了解具体案例,就不可能确定问题所在。所以我只做了一个粗略的猜测:如果Proguard不使用
这个
,是否可能将实例方法变成
静态
方法?也许我不应该环顾lambdas,而是将选项添加到我的公用程序中?正如错误所说的“由以下原因引起:java.lang.invoke.LambdaConversionException:lambda参数1的类型不匹配:class com.goodsoft.stockbox.commons.model.c无法转换为int”,因此它无法从commons.model读取对象。无法将掩码对象转换为int。有什么建议吗?这与对象无关,只是验证类型。类型签名由“捕获值(如果有)+功能签名”组成,类型签名由“接收器类型(如果不是<代码>静态)+目标方法参数”组成。两者必须匹配,通常重命名没有影响。但在这种情况下,Proguard将实例方法更改为
static
,其接收器类型将从签名中消失,并导致不匹配。我不知道Proguard是否进行了这样的转换,但如果是这样的话,禁用它将是值得一试的。我如何禁用它?也许你应该反过来尝试。您说过,当您使用
-dontoptimize
时,它会起作用,即禁用所有优化。所以,使用禁用所有优化作为起点,并尝试启用一个又一个优化。正如你所说的“但我不能禁用所有优化”,似乎有些优化你认为你不能放弃。所以从启用这些开始…
int newValue = computeBidAskDifference();
ValueChangeType type = previousValue > newValue ? ValueChangeType.DROP :
        previousValue < newValue ? ValueChangeType.GROWTH : ValueChangeType.EQUAL;

if (delegate != null)
    delegate.valueChanged(newValue, type);
<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.10</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <injar>StockBox.jar</injar>
        <outjar>StockBox.jar</outjar>
        <options>
            <option>-allowaccessmodification</option>
            <option>-keepdirectories</option>
            <option>-keep public class com.goodsoft.stockbox.Main { *; }</option>
            <option>-keep public class * implements
                com.goodsoft.stockbox.base.model.config.IConvertibleConfiguration
                { *;}
            </option>
            <option>-dontskipnonpubliclibraryclasses</option>
            <option>-dontskipnonpubliclibraryclassmembers</option>
            <option>-keepattributes RuntimeVisibleAnnotations</option>
            <option>-keep @javax.persistence.* class * { *;}</option>
            <option>-keepclassmembers enum * {
                public static **[] values();
                public static ** valueOf(java.lang.String);
                }
            </option>
            <option>-keep @org.springframework.context.annotation.Configuration class *</option>
            <option>-keep @org.springframework.beans.factory.annotation.Service class *</option>
            <option>-keep @org.springframework.stereotype.Component class *</option>
            <option>-keepclassmembers class * {
                @org.springframework.beans.factory.annotation.Autowired *;
                @org.springframework.beans.factory.annotation.Value *;
                @org.springframework.context.annotation.Bean *;
                }
            </option>
            <option>-adaptresourcefilecontents **.properties</option>
            <option>-keepattributes
                Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
            </option>
        </options>
        <maxMemory>512m</maxMemory>
        <libs>
            <lib>${java.home}/lib/rt.jar</lib>
            <lib>${java.home}/lib/jce.jar</lib>
        </libs>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard-base</artifactId>
            <version>${proguard.version}</version>
        </dependency>
    </dependencies>
</plugin>
<option>-optimizations !class/unboxing/enum</option>