Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javassist字节码操作与maven编译集成_Java_Maven_Javassist_Bytecode Manipulation_Annotation Processing - Fatal编程技术网

将javassist字节码操作与maven编译集成

将javassist字节码操作与maven编译集成,java,maven,javassist,bytecode-manipulation,annotation-processing,Java,Maven,Javassist,Bytecode Manipulation,Annotation Processing,我有一个用javac/aspectj编译器编译的maven项目。 我想在javassist程序编译的类上运行,该程序操作编译的类并向它们添加内容。 我想使用“流程类”阶段来运行我的工具。 我的问题是,使用javassist对“target/classes”中创建的类文件进行迭代的最佳方式是什么,这样我可以在以后加载、修复和保存。 另一个要求是在测试类上运行该工具。 如果有一个做类似事情的开源项目,那么看到一个实例将非常棒。 谢谢, Avner我最近偶然发现了同样的问题,我编写了一个小型Maven

我有一个用javac/aspectj编译器编译的maven项目。
我想在javassist程序编译的类上运行,该程序操作编译的类并向它们添加内容。
我想使用“流程类”阶段来运行我的工具。
我的问题是,使用javassist对“target/classes”中创建的类文件进行迭代的最佳方式是什么,这样我可以在以后加载、修复和保存。
另一个要求是在测试类上运行该工具。
如果有一个做类似事情的开源项目,那么看到一个实例将非常棒。
谢谢,

Avner

我最近偶然发现了同样的问题,我编写了一个小型Maven插件,在构建期间应用Javassist类转换。我在上共享了代码

您猜对了,应该使用过程类阶段,棘手的部分是类路径设置。经过一些尝试和错误之后,我终于猜出了项目、依赖项和Javassist之间的整个类路径问题(如果您想检查解决方案,请参阅
com.github.drochetti.Javassist.maven.JavassistMojo.execute()
code)

上面关于GitHub链接有一些指导原则,但基本上您需要:

1-在您的pom.xml上配置插件

<plugin>
    <groupId>com.github.drochetti</groupId>
    <artifactId>javassist-maven-plugin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <configuration>
        <includeTestClasses>false</includeTestClasses>
        <transformerClasses>
            <transformerClass>com.domain.ToStringTransformer</transformerClass>
        </transformerClasses>
    </configuration>
    <executions>
        <execution>
            <phase>process-classes</phase>
            <goals>
                <goal>javassist</goal>
            </goals>
        </execution>
    </executions>
</plugin>
注意:要实现transformer,您需要将插件添加为项目的依赖项,但不要担心,因为它只在构建期间使用,如果它的作用域为
,则它不会成为最终构建的依赖项

我希望这有帮助!如果你需要进一步的帮助,请告诉我


丹尼尔

谢谢你的解决方案。我已经使用maven exec插件来运行我的处理器,但我会在有时间的时候检查它。@Daniel Rochetti,插件看起来不错。请把它再往前推一点,在central上发布并提供一个例子。
/**
 * Silly transformer, used to hack the toString method.
 */
public class ToStringTransformer extends ClassTransformer {

    /**
     * We'll only transform subtypes of MyInterface.
     */
    @Override
    protected boolean filter(CtClass candidateClass) throws Exception {
        CtClass myInterface = ClassPool.getDefault().get(MyInterface.class.getName());
        return !candidateClass.equals(myInterface) && candidateClass.subtypeOf(myInterface);
    }

    /**
     * Hack the toString() method.
     */
    @Override
    protected void applyTransformations(CtClass classToTransform) throws Exception {
        // Actually you must test if it exists, but it's just an example...
        CtMethod toStringMethod = classToTransform.getDeclaredMethod("toString");
        classToTransform.removeMethod(toStringMethod);

        CtMethod hackedToStringMethod = CtNewMethod.make(
                "public String toString() { return \"toString() hacked by Javassist\"; }",
                classToTransform);
        classToTransform.addMethod(hackedToStringMethod);
    }

}