java

位置:IT落伍者 >> java >> 浏览文章

Java调用Eclipse的编译器JDT


发布日期:2023年11月03日
 
Java调用Eclipse的编译器JDT

想给项目做一个Nightly build项目特点如下

使用 Eclipse开发的java和GWT混合项目

目前有多个工程

项目处于初期很多部分尚未稳定因此是工程是工程间依赖工程没有引用编译好的jar包

工程主要分为前台clt公共模块common和服务器模块svr例如有一个mon一定有Aclt和Asvr依赖于mon但clt和svr间不相互依赖

(这是我们项目的编译过程的特殊逻辑)

以下是选定的技术路线

因为编译带有特殊的逻辑所以使用方便编程的java而非纯ant脚本

不想自己整理工程的编译顺序太多麻烦所以使用了domj读取eclipse工程配置信息

不用ant脚本可以使用Java程序调用Ant API

由于javac对模板的不友好 所以使用jdt

例如以下的代码

<! <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />;br/ /><br/ />>package demoserver;

import comextjsgxtuiclientdataBaseModel;

public class TestA extends BaseModel {

@Override

public < X > X get(String property) {

return super get(property);

}

}

使用javac编译就会出现

无法确定 <X>X 的类型参数对于上限为 XjavalangObject 的类型变量 X不存在唯一最大实例

虽然搜索了以下说只要返回值强制转换一下就ok即return (X)super get(property);

但这样的代码也比较多明明在eclipse编译通过的在javac就不行所以g了一下才知道 eclipse有自己的编译器(?不太确认javac和jdt的关系)叫jdt

首先要从Eclipse中抽取出一个JDT的包在Eclipse/plugin目录下找到一个re _v__Rxjar(版本社么的没有关系)用winrar解压出里面的一个jdtCompilerAdapterjar包然后从工程中引用它

顺便把

pilertool_v__Rxjar

re_v__Rxjar

orgeclipsejdtdebugui_v_rjar

这几个包也从eclipse/plugin中引用到项目里——为什么要单独解压jdtCompilerAdapterjar我不太清楚啊

然后由于要调用ant所以从apache上的ant项目中下载用到两个包

antjar

antlauncherjar

使用以下代码调用ant

<! <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />;br/ /><br/ />>package thssplatformutilmrobuild;

import javaioFile;

import orgapachetoolsantProject;

import orgapachetoolsanttaskdefsJavac;

import orgapachetoolsanttaskdefsJavacImplementationSpecificArgument;

import orgapachetoolsanttypesPath;

public class JavaBuilder {

public JavaBuilder() {

}

public void execute(Path classPath File output) {

Project currentProject = new Project();

// 填写工程的绝对目录这样后面可以使用相对目录

currentProjectsetBaseDir( new File( 这里是工程的绝对目录 ));

Javac compileJava = new Javac();

compileJavasetProject(currentProject);

// 调用jdt编译器

compileJavasetCompiler( reJDTCompilerAdapter );

compileJavasetClasspath(classPath);

compileJavasetEncoding( UTF );

// 填写相对目录src

compileJavasetSrcdir( new Path(currentProject src ));

// 编译后的结果class输出到哪里

compileJavasetDestdir(output);

compileJavasetTarget( );

compileJavasetSource( );

compileJavasetNowarn( true );

compileJavasetDebug( true );

compileJavasetDebugLevel( linessource );

// javac需要这段换成了jdt不知道要不要了

ImplementationSpecificArgument arg = compileJavacreateCompilerArg();

argsetLine( Xlint );

compileJavaexecute();

}

}

可能上述文章有很多概念性的问题例如我没有搞清的javac和jdt关系但是问题确实是解决了

上一篇:Listfiles.jsp-----DownloaServlet

下一篇:解决Java抓取页面遇到客户端身份认证的办法