为方便构建、打包项目,项目准备采用ant来构建,但在执行compile的target时,发现javac无法编译GXT的部分代码,例如:
- import com.extjs.gxt.ui.client.data.BaseModel;
- public class TestA extends BaseModel {
- @Override
- public < X > X get(String property) {
- return super .get(property);
- }
- }
使用javac编译,就会出现
无法确定 <X>X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例
然而在eclipse里面却可以编译通过,一开始以为是javac编译选项设置不对,后来发现怎么试也不行,后来在网上查了下,原来eclipse的编译器用的不是javac,而是自带的jdt,而jdt则存在于eclipse的一个plugin里面的org.eclipse.jdt.core_3.5.2.v_981_R35x.jar文件中,注意另外还要从改jar文件中将jdtCompilerAdapter.jar拉出来,然后把这两个jar文件都放到放到ant的lib目录下:
- <target name="compile" description="Compile Java classes required on serverside">
- <mkdir dir="war/WEB-INF/classes"/>
- <javac srcdir="src" destdir="war/WEB-INF/classes" encoding="utf-8" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"
- source="1.6" target="1.6">
- <classpath>
- <path refid="gwt.classpath" />
- <path refid="compile.classpath"/>
- </classpath>
- <compilerarg value="-Xlint"/>
- </javac>
- </target>
这里需要注意指定source和target的版本,否则可能会出现编译错误
通过这个配置,可以保证对所有java源码进行编译,另外在这一步编译完成后,还需要用gwt编译器将客户端代码编译为javascript,这个通过gwt提供的编译器来完成,其配置如下:
- <target name="gwtc" description="GWT compile to JavaScript" depends="compile">
- <mkdir dir="war/WEB-INF/classes"/>
- <java fork="true" classname="com.google.gwt.dev.Compiler">
- <classpath>
- <pathelement location="${src.dir}" />
- <pathelement location="war/WEB-INF/classes" />
- <path refid="compile.classpath" />
- <fileset dir="${gwt.home}">
- <include name="*.jar"/>
- </fileset>
- </classpath>
- <jvmarg value="-Xmx512M" />
- <arg value="-logLevel"/>
- <arg value="INFO"/>
- <arg value="-style"/>
- <arg value="Obfuscated"/>
- <arg value="com.certus.isa.isa"/>
- </java>
- </target>
上面的target,只需要提前定义好src.dir和gwt.home两个属性变量即可