向Java添加自定义编译时处理步骤的最佳方法是什么?

时间:2014-01-08 12:54:10

标签: java

在将源代码编译为字节代码之前,添加编译时步骤以分析和修改源代码的最简单方法是什么?

我可以用Java写这个吗? 它最好是作为IDE插件编写的吗?

1 个答案:

答案 0 :(得分:3)

  

我可以用Java写这个吗?

是的,当然。有许多基于Java的库用于操作字节码:

  

最好是作为IDE插件编写的吗?

在我看来,没有。你没有提到你正在使用哪个IDE,但根据我自己的经验,编写IDE插件比在Ant / Maven / Gradle等构建工具中添加自定义步骤有更陡峭的学习曲线。即使您目前没有使用这些构建工具之一,我个人认为,采用这些工具之一而不是编写IDE插件会更容易。

此外,将构建步骤绑定到特定IDE会使您的构建更具可移植性。在走这条路线之前需要考虑两件事:

1)如何在Jenkins或Bamboo等持续集成服务器上运行构建。调用在构建服务器上使用自定义插件的无头Eclipse / Netbeans构建并非不可能,但它并不像运行使用Ant / Maven / Gradle等“标准”工具的构建那样简单。

2)它会如何影响团队中的其他成员?您需要找到一种方法将插件分发给每个开发人员,处理插件的版本控制和更新等。团队中的每个人都使用相同的IDE吗?

我对您的项目,您的团队(如果您在团队中工作)或您正在开发的软件类型一无所知,因此这些考虑可能不适用于您。根据我自己的经验,我只是把它们作为思考的食物。

  

添加编译时步骤进行分析的最简单方法是什么?   在将源代码编译为字节代码之前修改源代码?

您在构建中使用了什么?蚂蚁? Maven的?摇篮?您遵循的确切步骤高度依赖于您的构建工具。

根据您要完成的任务,您可能根本不需要写任何内容。

  

例如,分析部分代码并将工作分成   必要时有多个线程 -

结帐AspectJ。您可以编写一个方面来拦截对某些方法的调用,并将它们提交给ExecutorService。有现成的插件可以从大多数常见的构建系统中调用AspectJ编译器。

如果你想自己写点什么,我认为最好的选择是write a custom Ant task。我建议使用Ant任务,因为它是最小的共同点。它当然可以使用Ant运行,但Maven和Gradle都可以调用Ant任务。

写一个extends Task的新课程并在那里做你的事。

public class MyTask extends Task {
    public void execute() {
     // do your bytecode manipulation here...
    }
}

你可以从你的Ant脚本中调用它:

<taskdef name="mytask" classname="MyTask" classpath="classes"/>
<mytask/>

查看Apache Axis2 code generation task以获取构建时间代码生成以及如何处理类路径问题/访问代码的示例。

相关问题