2016-08-05 158 views
1

我想用proguard混淆JAXB代碼。這是一個完整的Java類代碼:IllegalAnnotationsException使用proguard混淆JAXB代碼

import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlType; 

@XmlType(propOrder = 
{ 
    "setting", "subsystems" 
}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ProfileImpl implements Profile 
{ 
    @XmlAttribute 
    private String name; 
    @XmlAttribute 
    private final String version; 
    @XmlElementWrapper(name = "subsystems") 
    @XmlElement(name = "subsystem") 
    private List<SubsystemImpl> subsystems; 
    private SettingImpl setting; 

    public ProfileImpl() 
    { 
     this.version = "1.0"; 
     this.name = "default"; 
    } 

    public ProfileImpl(String name, SettingImpl setting, List<SubsystemImpl> subsystems, String version) 
    { 
     this.name = name; 
     this.setting = setting; 
     this.version = version; 
     this.subsystems = subsystems; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public List<SubsystemImpl> getSubsystems() 
    { 
     return subsystems; 
    } 

    public void setSubsystems(List<SubsystemImpl> subsystems) 
    { 
     this.subsystems = subsystems; 
    } 

    public SettingImpl getSetting() 
    { 
     return setting; 
    } 

    public void setSetting(SettingImpl setting) 
    { 
     this.setting = setting; 
    } 
} 

但是當我運行的代碼我得到:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions 
Property c is present but not specified in @XmlType.propOrder 
     this problem is related to the following location: 
       at private java.util.List org.settings.loader.osgi.impl.jaxb.ProfileImpl.c 
       at org.settings.loader.osgi.impl.jaxb.ProfileImpl 
       at private java.util.List org.settings.loader.osgi.impl.jaxb.f.b 
       at org.settings.loader.osgi.impl.jaxb.f 
Property d is present but not specified in @XmlType.propOrder 
     this problem is related to the following location: 
       at private org.settings.loader.osgi.impl.jaxb.d org.settings.loader.osgi.impl.jaxb.ProfileImpl.d 
       at org.settings.loader.osgi.impl.jaxb.ProfileImpl 
       at private java.util.List org.settings.loader.osgi.impl.jaxb.f.b 
       at org.settings.loader.osgi.impl.jaxb.f 

我怎樣才能解決這個問題?

我想這Proguard的配置,以逃課混淆:

<option>-keep public class org.settings.loader.osgi.impl.jaxb.ProfileImpl{public *; private *;} -keepattributes Exceptions, *Annotation*, InnerClasses, Signature, SourceFile, EnclosingMethod -dontshrink -dontoptimize -keepparameternames</option> 
+0

你可以添加整個'ProfileImpl'嗎? – Xstian

+0

帖子已更新 –

+0

'SettingImpl setting'上缺少'XmlElement'註解? –

回答

1

對於proguard的工藝註釋嘗試下面添加到參數

-keep public class javax.xml.bind.** 
-keep public class org.settings.loader.osgi.impl.jaxb.ProfileImpl implements org.settings.loader.osgi.impl.jaxb.Profile 
-keepattributes *Annotation* 

http://proguard.sourceforge.net/manual/examples.html#annotations

更新

我冒昧地將您的代碼修改了一下,如下所示。 請檢查此修改後,包括代碼後面的參數是否有所不同。

public class ProfileImpl implements Profile 
{ 
    private String name; 
    private final String version; 
    private List<SubsystemImpl> subsystems; 
    private SettingImpl setting; 

    public ProfileImpl(){ 
     this.version = "1.0"; 
     this.name = "default"; 
    } 

    public ProfileImpl(String name, SettingImpl setting, List<SubsystemImpl> subsystems, String version){ 
     this.name = name; 
     this.setting = setting; 
     this.version = version; 
     this.subsystems = subsystems; 
    } 

    @XmlAttribute(name = "name") 
    public String getName(){ 
     return name; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    @XmlAttribute(name = "version") 
    public String getVersion(){ 
     return version; 
    } 

    public void setVersion(String version){ 
     this.version = version; 
    } 

    @XmlElementWrapper(name = "subsystems") 
    @XmlElement(name = "subsystem") 
    public List<SubsystemImpl> getSubsystems(){ 
     return subsystems; 
    } 

    public void setSubsystems(List<SubsystemImpl> subsystems){ 
     this.subsystems = subsystems; 
    } 

    public SettingImpl getSetting(){ 
     return setting; 
    } 

    public void setSetting(SettingImpl setting){ 
     this.setting = setting; 
    } 
} 
+0

我已經測試過,沒有結果。請參閱更新後的帖子。 –

+0

@PeterPenzov請讓我知道如果更新的作品 –

+0

我得到這個java.lang.NullPointerException 在org.settings.loader.osgi.impl.jaxb.f.a(未知來源) –

0

請加上「名」和道具令「版本」也爲訪問類型定義爲現場

+0

CNA你給一些更多的信息你是什麼意思? –

+0

@ peter-penzov' private SettingImpl setting'在模糊處理過程中被重命名,所以它的新名稱就像'd'。另一方面,你在'propOrder'中指定了'setting',jaxb無法找到它(因爲實際上該字段不再存在)。您應該爲所有映射字段提供正確的名稱,即爲'@XmlAttribute(name =「...」)註釋設置名稱屬性' – vsminkov

+0

是的,我如何配置Proguard不要重命名這些字段? –