2013-01-24 2 views
2

Jar 파일을 실행하면 응용 프로그램이 잘 작동하여 내용을 표시하는 데 많은 TableView가있는 JavaFX 응용 프로그램을 하나 만들었습니다. 내 코드를 난독 화해야하므로 내 고객에게 응용 프로그램을 배포해야합니다. 내 코드의 난독 화를 위해 Proguard-4.8을 사용하고 있습니다.난독 화 후에 JavaFx TableView 내용이 사라졌습니다.

샘플 jar을 난처하게 만드는 Ant를 사용하여 하나의 샘플 TableView 빌드 스크립트를 만들었습니다. http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript.zip

내가 가진 - 나는 나의 전체 빌드 스크립트 프로젝트를 업로드 한

After Obfuscation

- 난독 항아리 후

Before Obfuscation

- 난독 항아리 만 준수하기 전에

그것을 완전히 실행하십시오. 당신은 발견 할 것이다 -

  1. 의 build.xml - http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/build.xml
  2. 난처하지 않고
  3. 컴파일 된 항아리 - http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/Sample.jar
  4. 난독 항아리 - http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/obfuscated/SampleObfuscated.jar
  5. Proguard.map - http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/obfuscated/ObfuscatedProguard.map
  6. 소스 자바 클래스 - http://neelamsharma.s3.amazonaws.com/SampleObfuscationBuildScript/src/TableViewWithButton.java

이건 내 build.xml 파일입니다 - - 다른 일이 있다는 것입니다 내가있는 TableView 내용을 볼 수 있어요 다음이 줄을 추가하는 경우의 build.xml에서

<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> 

하지만, 모든 public 클래스와 그 방법을 당황하게하지 않습니다 .

<keep access="public"> 
    <method access="public protected" /> 
</keep> 

내 프로젝트가 완전히 난독 화되어야합니다. 공용 클래스를 UN- 난독 화하지 않고 jar 파일을 난독 화하는 다른 방법으로 인해 TableView 텍스트를 완전히 볼 수 있습니다.

감사합니다,

Neelam 샤르마

답변

2

내가 PropertyValueFactory의 긴 양식을 사용하려고 시도하는 것이 좋습니다 :

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()); 
    } 
    });