Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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 使用proguard时格式错误的ParameterizedTypeException_Java_Reflection_Guice_Proguard - Fatal编程技术网

Java 使用proguard时格式错误的ParameterizedTypeException

Java 使用proguard时格式错误的ParameterizedTypeException,java,reflection,guice,proguard,Java,Reflection,Guice,Proguard,我正在使用proguard收缩一个着色的jar,用作命令行工具。着色的jar工作正常,但在运行proguard创建的jar时出现了一个异常。该应用程序使用Guice注入,我添加了我在SO上发现的配置,主要是在 这是个例外: Exception in thread "main" java.lang.reflect.MalformedParameterizedTypeException at sun.reflect.generics.reflectiveObjects.Paramet

我正在使用proguard收缩一个着色的jar,用作命令行工具。着色的jar工作正常,但在运行proguard创建的jar时出现了一个异常。该应用程序使用Guice注入,我添加了我在SO上发现的配置,主要是在

这是个例外:

Exception in thread "main" java.lang.reflect.MalformedParameterizedTypeException
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60)
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
        at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
        at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
        at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
        at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:84)
        at java.lang.Class.getGenericSuperclass(Class.java:696)
        at com.google.inject.internal.MoreTypes.getGenericSupertype(MoreTypes.java:273)
        at com.google.inject.TypeLiteral.getSupertype(TypeLiteral.java:257)
        at com.google.inject.spi.InjectionPoint.hierarchyFor(InjectionPoint.java:755)
        at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:635)
        at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356)
        at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151)
        at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585)
        at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:543)
        at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:529)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
        at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
        at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
        at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
        at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46)
        at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50)
        at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
        at com.google.inject.Guice.createInjector(Guice.java:95)
        at com.google.inject.Guice.createInjector(Guice.java:72)
        at com.google.inject.Guice.createInjector(Guice.java:62)
        at com.acme.ui.cli.Main.main(Main.java:44)
-injars acme-cli-0.2.1-SNAPSHOT.jar
-outjars target/acme-cli-0.2.1-SNAPSHOT.jar

-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jce.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jsse.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/rt.jar

-dontobfuscate
-dontpreverify
-dontoptimize
-printmapping mapping.map
-ignorewarnings
-keepattributes *Annotation*,Signature  


# Keep - Applications. Keep all application classes, along with their 'main' methods.
-keep public class com.acme.ui.cli.Main {
    public static void main(java.lang.String[]);
}


# Keep Guice-related classes
-keep public class javax.inject.**
-keep class com.google.inject**
-keep class * extends com.google.inject.AbstractModule

 # keeps all fields and Constructors annotated with @Inject and @AssistedInject
-keepclasseswithmembers class * {
    @com.google.inject.Inject <fields>;
    @com.google.inject.Inject <init>(...);
}

-keepclasseswithmembers class * {
    @com.google.inject.assistedinject.AssistedInject <fields>;
    @com.google.inject.assistedinject.AssistedInject <init>(...);
}
-keep class * {
   <init>(...);
}
线程“main”java.lang.reflect.MalformedParameterizedTypeException中的异常 位于sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60) 位于sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.(ParameterizedTypeImpl.java:53) 位于sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95) 位于sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105) 位于sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140) 在sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) 位于sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:84) 位于java.lang.Class.getGenericSuperclass(Class.java:696) 位于com.google.inject.internal.MoreTypes.getGenericSupertype(MoreTypes.java:273) 在com.google.inject.TypeLiteral.getSupertype上(TypeLiteral.java:257) 位于com.google.inject.spi.InjectionPoint.hierarchyFor(InjectionPoint.java:755) 在com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:635)上 在com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356)上 位于com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151) 位于com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585) 位于com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:543) 位于com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:529) 位于com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847) 位于com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772) 位于com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256) 位于com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205) 位于com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853) 位于com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46) 位于com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50) 在com.google.inject.internal.InternalInjectorCreator.InitializeStatly上(InternalInjectorCreator.java:133) 在com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)上 位于com.google.inject.Guice.createInjector(Guice.java:95) 位于com.google.inject.Guice.createInjector(Guice.java:72) 位于com.google.inject.Guice.createInjector(Guice.java:62) 位于com.acme.ui.cli.Main.Main(Main.java:44) 这是生成它的配置:

Exception in thread "main" java.lang.reflect.MalformedParameterizedTypeException
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60)
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
        at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
        at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
        at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
        at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:84)
        at java.lang.Class.getGenericSuperclass(Class.java:696)
        at com.google.inject.internal.MoreTypes.getGenericSupertype(MoreTypes.java:273)
        at com.google.inject.TypeLiteral.getSupertype(TypeLiteral.java:257)
        at com.google.inject.spi.InjectionPoint.hierarchyFor(InjectionPoint.java:755)
        at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:635)
        at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356)
        at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151)
        at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585)
        at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:543)
        at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:529)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
        at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
        at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
        at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
        at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46)
        at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50)
        at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
        at com.google.inject.Guice.createInjector(Guice.java:95)
        at com.google.inject.Guice.createInjector(Guice.java:72)
        at com.google.inject.Guice.createInjector(Guice.java:62)
        at com.acme.ui.cli.Main.main(Main.java:44)
-injars acme-cli-0.2.1-SNAPSHOT.jar
-outjars target/acme-cli-0.2.1-SNAPSHOT.jar

-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jce.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jsse.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/rt.jar

-dontobfuscate
-dontpreverify
-dontoptimize
-printmapping mapping.map
-ignorewarnings
-keepattributes *Annotation*,Signature  


# Keep - Applications. Keep all application classes, along with their 'main' methods.
-keep public class com.acme.ui.cli.Main {
    public static void main(java.lang.String[]);
}


# Keep Guice-related classes
-keep public class javax.inject.**
-keep class com.google.inject**
-keep class * extends com.google.inject.AbstractModule

 # keeps all fields and Constructors annotated with @Inject and @AssistedInject
-keepclasseswithmembers class * {
    @com.google.inject.Inject <fields>;
    @com.google.inject.Inject <init>(...);
}

-keepclasseswithmembers class * {
    @com.google.inject.assistedinject.AssistedInject <fields>;
    @com.google.inject.assistedinject.AssistedInject <init>(...);
}
-keep class * {
   <init>(...);
}
-injars acme-cli-0.2.1-SNAPSHOT.jar
-outjars目标/acme-cli-0.2.1-SNAPSHOT.jar
-libraryjars/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jce.jar
-libraryjars/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jsse.jar
-libraryjars/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/rt.jar
-顿托夫斯卡特
-不要翻转
-dontoptimize
-printmapping.map
-忽视警告
-keepattributes*注释*,签名
#保留应用程序。保留所有应用程序类及其“main”方法。
-保留公共类com.acme.ui.cli.Main{
公共静态void main(java.lang.String[]);
}
#保持与Guice相关的类
-保持公共类javax.inject**
-保持类com.google.inject**
-keep class*扩展com.google.inject.AbstractModule
#使用@Inject和@AssistedInject注释所有字段和构造函数
-keepclassswithmembers类*{
@com.google.inject.inject;
@com.google.inject.inject(…);
}
-keepclassswithmembers类*{
@com.google.inject.assistedinject.assistedinject;
@com.google.inject.assistedinject.assistedinject(…);
}
当我添加此选项时,问题就消失了:

Exception in thread "main" java.lang.reflect.MalformedParameterizedTypeException
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:60)
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
        at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
        at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
        at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
        at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
        at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:84)
        at java.lang.Class.getGenericSuperclass(Class.java:696)
        at com.google.inject.internal.MoreTypes.getGenericSupertype(MoreTypes.java:273)
        at com.google.inject.TypeLiteral.getSupertype(TypeLiteral.java:257)
        at com.google.inject.spi.InjectionPoint.hierarchyFor(InjectionPoint.java:755)
        at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:635)
        at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356)
        at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151)
        at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585)
        at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:543)
        at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:529)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
        at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
        at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
        at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
        at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46)
        at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50)
        at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
        at com.google.inject.Guice.createInjector(Guice.java:95)
        at com.google.inject.Guice.createInjector(Guice.java:72)
        at com.google.inject.Guice.createInjector(Guice.java:62)
        at com.acme.ui.cli.Main.main(Main.java:44)
-injars acme-cli-0.2.1-SNAPSHOT.jar
-outjars target/acme-cli-0.2.1-SNAPSHOT.jar

-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jce.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/jsse.jar
-libraryjars /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/rt.jar

-dontobfuscate
-dontpreverify
-dontoptimize
-printmapping mapping.map
-ignorewarnings
-keepattributes *Annotation*,Signature  


# Keep - Applications. Keep all application classes, along with their 'main' methods.
-keep public class com.acme.ui.cli.Main {
    public static void main(java.lang.String[]);
}


# Keep Guice-related classes
-keep public class javax.inject.**
-keep class com.google.inject**
-keep class * extends com.google.inject.AbstractModule

 # keeps all fields and Constructors annotated with @Inject and @AssistedInject
-keepclasseswithmembers class * {
    @com.google.inject.Inject <fields>;
    @com.google.inject.Inject <init>(...);
}

-keepclasseswithmembers class * {
    @com.google.inject.assistedinject.AssistedInject <fields>;
    @com.google.inject.assistedinject.AssistedInject <init>(...);
}
-keep class * {
   <init>(...);
}
-继续上课*{
(...);
}
但它保留了更多的类,并将jar的大小增加了一倍。我正在使用proguard 4.10,也尝试了4.9。以下是我尝试过的一些最相关的选项:

    -keepattributes *
    -keepparameternames
    -keep class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl {
        <init>(...);
    }
-keepattributes*
-基帕参数
-保留类sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl{
(...);
}
因为它似乎与Guice有关,保留所有构造函数解决了这个问题,所以我还尝试了各种方法来配置keep选项,但没有结果。但我必须说,我并不完全理解他们

我不确定它是否与问题有关,但看起来奇怪的是类ParameterizedTypeImpl中唯一的构造函数有这样的签名:
private ParameterizedTypeImpl(java.lang.class aClass,java.lang.reflect.Type[]types,java.lang.reflect.Type)
,但是stacktrace中的签名看起来像是接受ParameteredTypeImpl本身:
ParameteredTypeImpl.(ParameteredTypeImpl.java:53)


现在我被卡住了;非常感谢任何能进一步帮助我的建议。

这是Proguard 5.0中修复的已知错误。请参见

您能解决这个问题吗?我也在收到回复的地方发布了。您可以使用一些建议,但主要原因似乎是一个bug。我们还没有为ma发布一个例子