Ant 模糊处理后,JavaFx TableView内容消失
我创建了一个JavaFX应用程序,其中有许多TableView来显示内容,若我运行Jar文件,该应用程序运行良好。因为我需要将应用程序分发给我的客户,所以我的代码应该是模糊的。我正在使用Proguard-4.8对代码进行模糊处理 我已经使用Ant创建了一个示例TableView构建脚本,它混淆了示例jar 在模糊处理之前,仅适用于jar- 模糊处理后的Jar- 我已将完整的构建脚本项目上载到- 我已经完全运行了它。你会发现-Ant 模糊处理后,JavaFx TableView内容消失,ant,tableview,javafx,obfuscation,proguard,Ant,Tableview,Javafx,Obfuscation,Proguard,我创建了一个JavaFX应用程序,其中有许多TableView来显示内容,若我运行Jar文件,该应用程序运行良好。因为我需要将应用程序分发给我的客户,所以我的代码应该是模糊的。我正在使用Proguard-4.8对代码进行模糊处理 我已经使用Ant创建了一个示例TableView构建脚本,它混淆了示例jar 在模糊处理之前,仅适用于jar- 模糊处理后的Jar- 我已将完整的构建脚本项目上载到- 我已经完全运行了它。你会发现- build.xml- 没有混淆的编译Jar- 模糊Jar- P
<project name="sample" default="cleanBuildPackage" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
<property environment="env"/>
<property name="WorkingFolder" location="."/>
<property name="ClassPath" location="${env.JAVA_HOME}/jre/lib/jfxrt.jar;${env.JAVA_HOME}/lib/ant-javafx.jar;${WorkingFolder}/lib/proguard.jar;"/>
<property name="dist" value="dist"/>
<property name="main.class" value="TableViewWithButton"/>
<property name="app.name" value="Sample"/>
<target name="init">
<echo message="Java installation directory: ${java.home}"/>
<!-- Create the time stamp -->
<tstamp/>
<delete dir="${WorkingFolder}/build"/>
<delete dir="${dist}"/>
<mkdir dir="${dist}"/>
<mkdir dir="${WorkingFolder}/build"/>
</target>
<target name="CompilingSample" depends="init">
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant" classpath=".;${env.JAVA_HOME}/jre/lib/jfxrt.jar"/>
<javac classpath="${ClassPath};" srcdir="${WorkingFolder}/src" destdir="${WorkingFolder}/build"/>
</target>
<target name="CreatingSampleJar" depends="CompilingSample" description="generate the distribution" >
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant" classpath="${env.JAVA_HOME}/lib/ant-javafx.jar"/>
<fx:jar destfile="${WorkingFolder}/${app.name}.jar">
<fx:application mainClass="${main.class}"/>
<fileset dir="${WorkingFolder}/build"/>
</fx:jar>
</target>
<target name="Ofuscating" depends="CreatingSampleJar" >
<taskdef resource="proguard/ant/task.properties" classpath="${WorkingFolder}/lib/proguard.jar" />
<mkdir dir="obfuscated"/>
<proguard printmapping="obfuscated/ObfuscatedProguard.map"
renamesourcefileattribute="SourceFile" ignorewarnings="true">
-dontshrink
-dontoptimize
-libraryjars "${java.home}/lib/rt.jar"
-libraryjars "${java.home}/lib/javaws.jar"
-libraryjars "${env.JAVA_HOME}/lib/ant-javafx.jar"
-libraryjars "${env.JAVA_HOME}/jre/lib/jfxrt.jar"
-injars ${WorkingFolder}/${app.name}.jar
-outjars ${WorkingFolder}/Obfuscated.jar
-ignorewarnings
<keepattribute name="InnerClasses" />
<keepattribute name="SourceFile" />
<keepattribute name="LineNumberTable" />
<keepattribute name="Deprecated" />
<keepattribute name="*Annotation*" />
<keepattribute name="Signature" />
-adaptresourcefilecontents **.fxml,**.properties,META-INF/MANIFEST.MF,images/*,publicCerts.store,.version
<!--
If I am adding this then I am able to see TableView Contents, but it do not obfuscate all public classes and their methods.
<keep access="public">
<method access="public protected" />
</keep>
-->
-keepclassmembernames class * {
@javafx.fxml.FXML *;
}
-keepclasseswithmembers public class com.javafx.main.Main, TableViewWithButton {
public static void main(java.lang.String[]);
}
</proguard>
</target>
<target name="Movejar" depends="Ofuscating">
<move
file="${WorkingFolder}/Obfuscated.jar"
tofile="obfuscated/${app.name}Obfuscated.jar" verbose="true" overwrite="true" />
</target>
<target name="cleanBuildPackage" depends="Movejar">
<fx:deploy width="800" height="600" nativeBundles="all" outdir="${dist}" outfile="${app.name}">
<fx:info title="${app.name}"/>
<fx:application name="${app.name}" mainClass="${main.class}"/>
<fx:resources>
<fx:fileset dir="${dist}" includes="*.jar"/>
</fx:resources>
</fx:deploy>
</target>
</project>
-dontshrink
-dontoptimize
-libraryjars“${java.home}/lib/rt.jar”
-libraryjars“${java.home}/lib/javaws.jar”
-libraryjars“${env.JAVA_HOME}/lib/antjavafx.jar”
-libraryjars“${env.JAVA_HOME}/jre/lib/jfxrt.jar”
-injars${WorkingFolder}/${app.name}.jar
-outjars${WorkingFolder}/Obfuscated.jar
-忽视警告
-AdapterResourceFileContents**.fxml、**.properties、META-INF/MANIFEST.MF、images/*、publicCerts.store、.version
-keepclassmembernames类*{
@javafx.fxml.fxml*;
}
-KeepClassSwithMembers公共类com.javafx.main.main,TableViewWithButton{
公共静态void main(java.lang.String[]);
}
在build.xml中,如果我添加这几行,那么我就可以看到TableView内容,但它不会混淆所有公共类及其方法
<keep access="public">
<method access="public protected" />
</keep>
我需要把我的项目完全弄糊涂。有没有其他方法可以使jar文件模糊化,而不使公共类保持未模糊状态,这样我就可以完全看到TableView文本
谢谢
尼拉姆·夏尔马(Neelam Sharma)我建议尝试使用长格式的属性值工厂(Property Value Factory):
col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Test, String>,
ObservableValue<String>>() {
public ObservableValue<String> call(TableColumn.CellDataFeatures<Test, String> t) {
// t.getValue() returns the Test instance for a particular TableView row
return t.getValue().testProperty();
// or
return new SimpleStringProperty(t.getValue().getMessage());
}
});
col.setCellValueFactory(新回调(){
公共observeValue调用(TableColumn.celldatat){
//t.getValue()返回特定TableView行的测试实例
返回t.getValue().testProperty();
//或
返回新的SimpleStringProperty(t.getValue().getMessage());
}
});