在将源代码编译为字节代码之前,添加编译时步骤以分析和修改源代码的最简单方法是什么?
我可以用Java写这个吗? 它最好是作为IDE插件编写的吗?
答案 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以获取构建时间代码生成以及如何处理类路径问题/访问代码的示例。