2015-11-08 30 views
6

Sto creando un agente java che verrà utilizzato per eseguire alcune modifiche bytecode ad alcune classi org.eclipse.jdt.core.JDTCompilerAdapter è una di queste. Sto usando javassit per modificare alcuni il metodo execute() di org.eclipse.jdt.core.JDTCompilerAdapter. Così ho incluso CGCE come nel mio progetto agente (usando Gradle)Impossibile caricare la classe org.eclipse.jdt.core.JDTCompilerAdapter a causa di una dipendenza non valida

compile group: 'org.eclipse.jdt.core.compiler' ,name: 'ecj', version :'4.3.1' 

Come ho bisogno di usare alcune classi dalla Corte di giustizia europea.

L'obiettivo dell'agente è intercettare le chiamate per eseguire il metodo, modificare il metodo di esecuzione per aggiungere alcune chiamate ad alcune delle mie classi al fine di attivare alcune elaborazioni.

Sto testando l'agente con un semplice progetto java con 2 classi. il progetto è compilato con form e utilizza JDTCompilerAdapter come compilatore.

Ecco il file build.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<project basedir="." default="build" name="TestProject"> 
<property file="build.properties" /> 

<property name="debuglevel" value="source,lines,vars"/> 
<property name="target" value="1.7"/> 
<property name="source" value="1.7"/> 
<path id="PClasspath"> 
    <pathelement location="bin"/> 
</path> 


<target name="init"> 
    <mkdir dir="bin"/> 
    <copy includeemptydirs="false" todir="bin"> 
     <fileset dir="src"> 
      <exclude name="**/*.java"/> 
     </fileset> 
    </copy> 
</target> 
<target name="clean"> 
    <delete dir="bin"/> 
</target> 
<target depends="clean" name="cleanall"/> 
<target depends="init" name="build"> 

    <javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}"> 
     <src path="src"/> 
     <classpath refid="PClasspath"/> 

    </javac> 
</target> 
<!-- 
<target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler"> 
    <copy todir="${ant.library.dir}"> 
     <fileset dir="${ECLIPSE_JDT_CORE}" includes="*.jar"/> 
    </copy> 
</target>--> 
<target name="build-e" > 

    <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> 
    <antcall target="build"/> 
</target> 

L'agente deve essere utilizzato durante la creazione di un progetto. Così, per testare l'agente Io uso questo comando:

java -jar agent-wrapper.jar --outdir ./out --exec ./build_wrapper.sh 

build_wrapper.sh contiene questo (ho aggiunto dipendenza CGE così ho potuto compilare il progetto con JDTCompilerAdapter come ho fatto in bulid.xml <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>:

../ant/bin/ant -lib ../eclipse/plugins/ecj-4.3.1.jar build-e 

L'idea è che l'agent-wrapper analizzerà l'argomento (outdir è utilizzato per generare alcune cose ed exec è uno script utilizzato per avviare una build del mio progetto di test) ottenere il comando da eseguire da build_wrapper.sh (in questo caso ../ant/bin/ant -lib ../eclipse/plugins/ecj-4.3.1.jar build-e) e aggiungerlo come agente java al comando.

Il problema si verifica durante l'esecuzione dell'agente. Ecco l'output:

java -jar custom-agent.jar --outdir ./out --exec ./build_wrapper.sh        [10:18:53] 
Picked up JAVA_TOOL_OPTIONS: -javaagent:/Users/dev/TestAgent/project/custom-agent.jar=OUTDIR=/Users/dev/TestAgent/project/./out 
objc[30474]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined. 
Buildfile: /Users/dev/TestAgent/project/build.xml 

build-e: 

init: 
    [mkdir] Created dir: /Users/dev/TestAgent/project/bin 

build: 

BUILD FAILED 
/Users/dev/TestAgent/project/build.xml:47: The following error occurred while executing this line: 
/Users/dev/TestAgent/project/build.xml:32: Class org.eclipse.jdt.core.JDTCompilerAdapter could not be loaded because of an invalid dependency. 

Total time: 2 seconds 
abnormal termination, exit code: 1 

Quando non uso CGE-4.3.1.jar all'interno del mio progetto di agente, la build funziona bene io intercettare la chiamata al execute() metodo, ma non posso usare le altre classi dal barattolo di ecj.

+0

Si prega di vedere se questo link aiuta. Come da quel collegamento ci potrebbe essere conflitto di percorso di classe. https://www.liferay.com/community/forums/-/message_boards/message/43851128 – Rao

risposta

2

L'errore di stop show è "Classe org.eclipse.jdt.core.JDTCompilerAdapter non può essere caricato a causa di una dipendenza non valida."

primo accenno alla colpa potrebbe essere trovato dalla lettura di questo link http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-ant_javac_adapter.htm

Il secondo suggerimento potrebbe essere che uno dei vasi richiesti per l'esecuzione del JDTCompilerAdapter manca.

Per far funzionare JDTCompilerAdapter, ho copiato sia JDTCompilerAdapter.jar che org.eclipse.jdt.core.jar nella cartella ant/lib.

Ci sono differenze basate sulla versione di eclipse e sulla versione di java che sono documentate nel collegamento menzionato sopra.

Problemi correlati