Class org.eclipse.jdt.core.JDTCompilerAdapter 由于依赖项无效而无法加载

Class org.eclipse.jdt.core.JDTCompilerAdapter could not be loaded because of an invalid dependency

我正在创建一个 java 代理,用于对某些 类 进行一些字节码修改 org.eclipse.jdt.core.JDTCompilerAdapter 就是其中之一。我正在使用 javassit 修改 org.eclipse.jdt.core.JDTCompilerAdapter 的一些 execute() 方法。所以我在我的代理项目中包含了 ecj(使用 gradle)

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

因为我需要使用一些来自 ecj 的 类。

agent的目标是拦截对execute方法的调用,修改execute方法添加一些对我的一些类的调用,目的是触发一些处理。

我正在针对具有 2 类 的简单 java 项目测试代理。该项目是用 ant 构建的,并使用 JDTCompilerAdapter 作为编译器。

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

在构建项目时使用该代理。 所以为了测试代理,我使用这个命令:

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

build_wrapper.sh 包含这个(我添加了 ecj 依赖项,所以我可以用 JDTCompilerAdapter 编译项目,就像我在 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

想法是代理包装器将解析参数(outdir 用于生成一些东西,exec 是用于启动我的测试项目构建的脚本)从 build_wrapper.sh(在本例中为 ../ant/bin/ant -lib ../eclipse/plugins/ecj-4.3.1.jar build-e)并将其作为 java 代理添加到命令中。

问题发生在代理执行过程中。这是输出:

    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

当我不在我的代理项目中使用 ecj-4.3.1.jar 时,构建运行良好我拦截了对 execute() 方法的调用但我不能使用其他 类 来自 ecj jar.

show stopper错误是"Class org.eclipse.jdt.core.JDTCompilerAdapter could not be loaded because of an invalid dependency."

阅读这篇文章可能会发现第一个错误提示link http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-ant_javac_adapter.htm

第二个提示可能是 运行 JDTCompilerAdapter 所需的 jar 之一丢失。

为了让 JDTCompilerAdapter 工作,我将 JDTCompilerAdapter.jar 和 org.eclipse.jdt.core.jar 都复制到了 ant/lib 文件夹中。

根据 eclipse 的版本和 java 的版本存在差异,这些差异在上面提到的 link 中有记录。