Java JAXB proguard优化后的空字段

Java JAXB proguard优化后的空字段,java,xml,jaxb,proguard,Java,Xml,Jaxb,Proguard,我试图使用proguard混淆使用JAXB的Java应用程序。代码(使用公共可用库)是 导入java.io.File; 导入java.io.FileInputStream; 导入java.io.FileNotFoundException; 导入java.io.InputStream; 导入java.util.List; 导入javax.xml.bind.JAXBContext; 导入javax.xml.bind.JAXBElement; 导入javax.xml.bind.JAXBExceptio

我试图使用proguard混淆使用JAXB的Java应用程序。代码(使用公共可用库)是

导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.InputStream;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.JAXBException;
导入javax.xml.bind.Unmarshaller;
导入org.cansas.cansas1d.SASdataType;
导入org.cansas.cansas1d.saEntryType;
导入org.cansas.cansas1d.sacentrytype.Run;
导入org.cansas.cansas1d.SASrootType;
公共类读卡器{
私有静态最终字符串RES_DIR=“/Users/paul/Documents/sample data/ZZ非2D格式/canSAS/”;
私有静态最终字符串JAXB_CONTEXT=“org.cansas.cansas1d”;
私有jaxbcontextjc;
私有JAXBElement-xmlJavaData;
/**
*打开cansas1d文件
*
*@param-xmlFile
*@return SasRootType对象(保存第二个方法调用)
*@jaxbeexception
*@抛出FileNotFoundException
*/
@抑制警告(“未选中”)
公共SASrootType loadXML(字符串xmlFile)抛出JAXBEException、FileNotFoundException{
jc=JAXBContext.newInstance(JAXB_CONTEXT);//引用名称空间:
Unmarshaller Unmarshaller=jc.createUnmarshaller();
InputStream in=新文件InputStream(新文件(xmlFile));
xmlJavaData=(JAXBElement)unmarshaller.unmarshal(in);
返回xmlJavaData.getValue();
}
/**
*比toString()方法更详细地描述XML数据
*并打印到标准输出。
*/
公共作废完整报告(SASrootType srt){
for(saEntryType条目:srt.getSASentry()){
System.out.println(“SASentry”);
System.out.printf(“标题:\t%s\n”,entry.getTitle());
List runs=entry.getRun();
System.out.printf(“#Runs:\t%d\n”,Runs.size());
用于(运行:运行){
System.out.printf(“Run@name:\t%s\n“,运行.getName());
System.out.printf(“运行:\t%s\n”,Run.getValue());
}
列表数据集=entry.getSASdata();
System.out.printf(“#SASdata:\t%d\n”,entry.getSASdata().size());
用于(SASdataType sdt:数据集){
System.out.printf(“SASdata@name:\t%s\n“,sdt.getName());
System.out.printf(“#points:\t%d\n”,sdt.getIdata().size());
}
System.out.println();
}
}
/**
*内存中数据的简单表示
*/
公共字符串toString(SASrootType sasRoot){
返回“SASentry元素:”+sasRoot.getSASentry().size();
}
/**
*@param args
*/
公共静态void main(字符串[]args){
System.out.println(“类:+CansasReader.class.getCanonicalName());
字符串[]文件列表={
RES_DIR+“cs_collagen.xml”,
RES_DIR+“1998spheres.xml”,
“找不到\u this.xml”
};
for(字符串xmlFile:fileList){
System.out.println(“\n\n文件:+xmlFile”);
试一试{
CansasReader rdr=新的CansasReader();
SASrootType srt=rdr.loadXML(xmlFile);
System.out.println(rdr.toString(srt));
rdr.完整报告(srt);
System.out.println(“结束”);
}catch(filenotfounde异常){
System.out.println(“未找到文件:+xmlFile”);
}捕获(JAXBEException e){
System.out.println(“无法打开(解组)XML文件”+xmlFile);
}
}
}
}
proguard配置文件是

-injars  CansasReader.jar
-outjars CansasReader_ob.jar
-libraryjars <java.home>/lib/rt.jar
-printmapping CansasReader.map
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable, *Annotation*, EnclosingMethod, Signature
-keep public class * {
    public protected *;
}
-repackageclasses ''
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-keeppackagenames org.cansas.cansas1d
-keepparameternames
-keep,includedescriptorclasses public  class org.cansas.cansas1d.package-info
-keep,includedescriptorclasses public class org.cansas.cansas1d.FloatUnitType
(and the same for every other class in the package)
-keep,includedescriptorclasses public class CansasReader
-injars CansasReader.jar
-outjars CansasReader_ob.jar
-libraryjars/lib/rt.jar
-printmapping CansasReader.map
-重命名SourceFileAttribute源文件
-keepattributes源文件,LineNumberTable,*注释*,封闭方法,签名
-保持公开课*{
受公众保护*;
}
-重新打包类“”
-超载
-defaultpackage“”
-允许访问修改
-keeppackagenames org.cansas.cansas1d
-基帕参数
-保留,包括描述类公共类org.cansas.cansas1d.package-info
-保留,includedescriptorclasses公共类org.cansas.cansas1d.FloatUnitType
(包装中的其他每一类也相同)
-保留(包括描述类)公共类CansReader
在模糊处理之前,输出与预期一致。在混淆之后,我没有得到任何异常,但预期的数据字段为空。例如,输出

文件:/Users/paul/Documents/sample data/ZZ Non-2D formats/canSAS/cs_collagen.xml SASentry元素:1个SASentry 标题:干鸡胶原蛋白,d=673 A,6531 eV,X6B

跑步次数:1次Run@name:运行时间:1994年9月19日01:41:02上午 数据:1SASdata@name: 积分:125 在模糊化之后:

文件:/Users/paul/Documents/sample data/ZZ Non-2D formats/canSAS/cs_collagen.xml SASentry元素:1个SASentry 标题:空

跑步次数:0 数据:0 注意,根据这个列表上的其他建议,我在配置文件中同时包含了签名和*Annotation*。这可以防止我之前遇到的类型转换异常,但是xml文件仍然没有被正确读取。任何建议,谢谢

-keep public class your.package.path.to.jaxb.classes.** {
  public protected private *;
}

这应该会有所帮助。我想你已经找到了解决办法。顺致敬意,Ralph。

当您(取消)从一个公开可用的库中封送SAS对象时:您不能将这个库从混淆中排除吗?当我告诉proguard显式保留库中的所有类时,我想这就是我所做的。有更好的方法吗?我的最终目标是创建一个jar文件,供未下载公共库的其他人使用,因此我希望我的jar文件包含运行所需的所有内容。可能您需要一个更强大的“解毒剂”,例如-keepclasseswithmembers。JAXB通过refl访问这些文件
-keep public class your.package.path.to.jaxb.classes.** {
  public protected private *;
}