31. august 2003 - 15:53Der er
11 kommentarer og 1 løsning
Eksekvering af kode ved kompilering.
Hejsa,
Jeg har et stykke kode, der generer en privat nøgle til et certifikat. Jeg vil gerne have, at koden kun bliver udført ved kompileringen af .class filen, og herefter ikke eksekveres. På den måde vil nøglen altid have den samme værdi ved kørsel af .class filen, og for at lave en ny nøgle, skal programmet hermed blot re-kompileres.
Jeg mener ikke at der er nogen faciliteter i Jav asprohet du kan bruge.
Men du kan lave en utility som: 1) genererer 2) compiler #2 kan opnåes enten ved at bruge Runtime.getRuntime().exec() eller ved at kalde javac i lib/tools.jar !
Joh. Her er et jeg selv bruger i et lille hobbyprojekt: (Det kræver jo selvfølgeligt at ant er installeret og opsat)
Det er specielt i init du skal kigge efter at få udført et program under compile processen. Man kan lave stort set alt i disse omgivelser. Mangler man en task kan man selv udvikle den i java og bruge den i Ant, det er IMHO et meget stærkt udviklingsværktøj.
<project name="World" default="all" basedir=".">
<!-- set global properties for this build --> <property name="src" value="src"/> <property name="build" value="build"/> <property name="dist" value="dist"/> <property name="lib" value="lib"/> <property name="doc" value="doc"/> <property name="ext" value="ext"/>
<target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> <!-- Create the distribution directory used by dist --> <mkdir dir="${dist}"/> <!-- execute test.bat on windoze platform --> <exec dir="." executable="cmd" os="Windows NT"> <arg line="/c test.bat"/> </exec> </target>
<target name="compile" depends="init"> <!-- Compile the java code from ${src} into ${build} with debug info --> <javac debug="on" srcdir="${src}" destdir="${build}"/> </target>
<target name="compilehard" depends="init"> <!-- Compile the java code from ${src} into ${build} minus debug --> <javac debug="off" srcdir="${src}" destdir="${build}"/> </target>
<target name="servertest" depends="compile, data"> <!-- Put everything in ${build} into the Server-${DSTAMP}.jar file --> <jar jarfile="${dist}/Server-${DSTAMP}.jar" manifest="lib/server_manifest.mf"> <fileset dir="${build}"/> </jar> </target>
arne v: I forbindelse med det program jeg er ved at lave, er der et krav til at nøglen ikke må ligge som en fil på harddisken. Her tænkte jeg på, om det ikke er muligt at "stoppe" .class-filen med den genererede nøgle i en .exe-fil sammen med selve programmet? ...selvom det ikke lige er "The Java way".
arne v: Lige kort til sidst, inden du får dine fortjente point - Hvad er fordelen ved at ligge nøgle i en DLL frem for at hardkode den i selve programmet? - Vil .DLL'en ikke ligge på disken eller?
Det er betydeligt sværere at decompilere en EXE/DLL end java byte kode.
I.s.f. at lave en usupporteret konvertering af hele java byte koden så synes jeg at det er bedr ebare at kalde et lille bitte stykke native kode i en DLL via JNI.
Husk at "manuelt obfuscate" C/C++ koden lidt således at keyen ikke ligger krypteret i DLL'en.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.