gwtant

ant gwt compiler task fails


I'm following this tutorial to create my ant build file that java compiles, than GWT compiles than perform the correct actions to build my .war file.

I use Eclipse and GWT-compile works, and when I run the development mode it works. I have also successfully deployed on tomcat.

The things is when I run my script, the compiles work but it fails on the gwt-compiler task. My ant build script is as follow :

<project name="vlp" default="gwt.compile" basedir=".">
    <tstamp />
    <!-- ################# PROPERTIES ################ -->
    <!-- directory properties -->
    <!-- source -->
    <property name="projectName" value="VirtualLabPortal" />
    <property name="src.dir" location="src" />
    <property name="build.dir" location="bin" />
    <property name="src.build.dir" location="${build.dir}/src" />
    <property name="gwt.build.dir" location="${build.dir}/gwt" />
    <property name="gwt.unitCache.dir" location="gwt-unitCache" />
    <!-- libraries -->
    <property name="src.lib.dir" location="war/WEB-INF/lib" />

    <!-- ___________________________________________________________________
        |                                                                   |
        |               Configure path source/test                          |
        |___________________________________________________________________| 
    -->
    <path id="compile.path">
        <fileset dir="${src.lib.dir}" includes="*.jar" />
        <fileset dir="${src.lib.dir}/gwt" includes="*.jar" />
    </path>
    <!-- ___________________________________________________________________
        |                                                                   |
        |               Clean old compiled source/test/war                  |
        |___________________________________________________________________| 
    -->
    <target name="clean" description="Clean all the old build files.">
        <delete dir="${build.dir}" />
        <delete dir="${gwt.unitCache.dir}" />
        <delete file="${projectWar}" />
        <delete file="${src.lib.dir}/${projectJar}" />
    </target>
    <!-- ___________________________________________________________________
        |                                                                   |
        |                       Compile the source                          |
        |(should exclude gwtview code which is compiled by the gwt compiler)|   
        |___________________________________________________________________| 
    -->
    <target name="src.compile" depends="clean" description="Compile the source code when everything has been cleaned.">
        <mkdir dir="${src.build.dir}" />
        <javac encoding="utf-8" destdir="${src.build.dir}" nowarn="true">
            <src path="${src.dir}" />
            <classpath refid="compile.path" />
        </javac>
    </target>
    <!-- ___________________________________________________________________
        |                                                                   |
        |                       Invoke the GWT compiler                     |
        |___________________________________________________________________| 
    -->
    <property name="module.gwt.xml" location="${src.dir}/com/banctecmtl/ca/vlp" />
    <target name="gwt.compile" depends="src.compile">
        <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
            <classpath>
                <!-- src dir is added to ensure the module.xml file(s) are on the classpath -->
                <pathelement location="${module.gwt.xml}" />
                <path refid="compile.path" />
            </classpath>
            <jvmarg value="-Xmx512m" />
            <arg line="${projectName} -logLevel ALL -style OBF -war ${build.dir}" />
        </java>
    </target>
    <!-- ___________________________________________________________________
        |                                                                   |
        |           Copy the config files in the war directory              |
        |___________________________________________________________________| 
    -->
    <property name="config.dir" location="war/config" />
    <target name="copy-resources">
        <copy todir="war/config" preservelastmodified="true">
            <fileset dir="${config.dir}">
                <include name="**.*" />
            </fileset>
        </copy>
    </target>
    <!-- ___________________________________________________________________
        |                                                                   |
        |           Create a Jar to be included in the war                  |
        |___________________________________________________________________| 
    -->
    <property name="projectJar" value="${projectName}.jar" />
    <property name="gwt.client.dir" location="com/banctecmtl/ca/vlp/view/webview" />
    <target name="jar" depends="src.compile">
        <!-- should also depend on gwt.compile -->
        <jar jarfile="${src.lib.dir}/${projectJar}" basedir="${src.build.dir}/">
            <!-- Don't wrap any of the client only code into the JAR
                <exclude name="${gwt.client.dir}/**/*.class"/> -->
            <exclude name="${gwt.client.dir}/**/*.class" />
        </jar>
    </target>
    <!-- ___________________________________________________________________
        |                                                                   |
        |                   Create a War from the source                    |
        |___________________________________________________________________| 
    -->
    <property name="projectWar" value="${projectName}.war" />
    <target name="war" depends="jar,copy-resources">
        <war basedir="war" destfile="${projectWar}" webxml="war/WEB-INF/web.xml">
            <exclude name="WEB-INF/**" />
            <webinf dir="war/WEB-INF/">
                <include name="lib/*.jar" />
                <include name="classes/*.properties" />
                <exclude name="**/gwt-dev.jar" />
                <exclude name="**/gwt-user.jar" />
            </webinf>
        </war>
    </target>

    <!-- ___________________________________________________________________
        |                                                                   |
        |                   Deploy to the production server                 |
        |___________________________________________________________________| 
    -->
    <!-- It is possible you can't run this from eclipse,
     you need to edit the run configurations and add the 
     latest jsch library to the classpath -->
    <property name="user" value="root" />
    <property name="password" value="Banctec01" />
    <property name="prodHost" value="vlp" />
    <property name="dest" value="/usr/share/tomcat6/webapps/ROOT.war" />
    <target name="deploy" depends="war">
        <echo message="Copying to : ${user}@${prodHost}:${dest}" />
        <scp file="${projectWar}" remoteTofile="${user}@${prodHost}:${dest}" password="${password}" trust="true" />
    </target>
</project>

It fails with the following error :

Buildfile: D:\workspace\vlp\build.xml
clean:
   [delete] Deleting directory D:\workspace\vlp\war\WEB-INF\classes
src.compile:
    [mkdir] Created dir: D:\workspace\vlp\war\WEB-INF\classes
    [javac] D:\workspace\vlp\build.xml:42: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 134 source files to D:\workspace\vlp\war\WEB-INF\classes
    [javac] Note: D:\workspace\vlp\src\com\banctecmtl\ca\vlp\controller\schedule\ScheduledTaskManager.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
gwt.compile:
     [java] Checking for updates
     [java]    First launch was 134c3e23387
     [java]    Last ping was Mon Apr 23 14:42:48 EDT 2012, min wait is 86400000ms
     [java] Module location: file:/D:/workspace/vlp/src/com/banctecmtl/ca/vlp/VirtualLabPortal.gwt.xml
     [java] Loading inherited module 'com.google.gwt.user.User'
     [java]    Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/user/User.gwt.xml
     [java]    Loading inherited module 'com.google.gwt.animation.Animation'
     [java]       Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/animation/Animation.gwt.xml
     [java]       Loading inherited module 'com.google.gwt.core.Core'
     [java]          Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/core/Core.gwt.xml
     [java]          Loading inherited module 'com.google.gwt.dev.jjs.intrinsic.Intrinsic'
     [java]             Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-dev.jar!/com/google/gwt/dev/jjs/intrinsic/Intrinsic.gwt.xml
     [java]             Loading inherited module 'com.google.gwt.lang.LongLib'
     [java]                Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-dev.jar!/com/google/gwt/lang/LongLib.gwt.xml
     [java]          Loading inherited module 'com.google.gwt.emul.Emulation'
     [java]             Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/emul/Emulation.gwt.xml
     [java]             Loading inherited module 'com.google.gwt.logging.LogImpl'
     [java]                Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/logging/LogImpl.gwt.xml
     [java]          Loading inherited module 'com.google.gwt.xhr.XMLHttpRequest'
     [java]             Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/xhr/XMLHttpRequest.gwt.xml
     [java]             Loading inherited module 'com.google.gwt.core.Core'
     [java]                Module 'com.google.gwt.core.Core' has already been loaded and will be skipped
     [java]          Loading inherited module 'com.google.gwt.core.CompilerParameters'
     [java]             Module location: jar:file:/D:/workspace/vlp/war/WEB-INF/lib/gwt/gwt-user.jar!/com/google/gwt/core/CompilerParameters.gwt.xml
     [java]          [...]
     [java]    Loading inherited module 'com.google.gwt.user.User'
     [java]       Module 'com.google.gwt.user.User' has already been loaded and will be skipped
     [java] Public resources found in...
     [java] Translatable source found in...
     [java] Persistent unit cache dir set to: D:\workspace\vlp\war\..\gwt-unitCache
     [java] Compiling module VirtualLabPortal
     [java] Looking for previously cached Compilation Units in D:\workspace\vlp\war\..\gwt-unitCache
     [java] Loaded 0 units from persistent store.
     [java] Starting UnitWriteThread.
     [java]    Found 0 cached units.  Used 0 / 2413 units from cache.
     [java] [ERROR] Unexpected internal compiler error
     [java] java.lang.RuntimeException: Exception processing units
     [java]     at com.google.gwt.dev.javac.CompilationStateBuilder$CompileMoreLater.compile(CompilationStateBuilder.java:248)
     [java]     at com.google.gwt.dev.javac.CompilationStateBuilder.doBuildFrom(CompilationStateBuilder.java:447)
     [java]     at com.google.gwt.dev.javac.CompilationStateBuilder.buildFrom(CompilationStateBuilder.java:370)
     [java]     at com.google.gwt.dev.cfg.ModuleDef.getCompilationState(ModuleDef.java:360)
     [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:252)
     [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:233)
     [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:145)
     [java]     at com.google.gwt.dev.Compiler.run(Compiler.java:232)
     [java]     at com.google.gwt.dev.Compiler.run(Compiler.java:198)
     [java]     at com.google.gwt.dev.Compiler$1.run(Compiler.java:170)
     [java]     at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:88)
     [java]     at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:82)
     [java]     at com.google.gwt.dev.Compiler.main(Compiler.java:177)
     [java] Caused by: java.lang.NoSuchMethodError: com.google.gwt.dev.jjs.ast.JProgram.serializeTypes(Ljava/util/List;Ljava/io/ObjectOutputStream;)V
     [java]     at com.google.gwt.dev.javac.CompilationUnitImpl.<init>(CompilationUnitImpl.java:68)
     [java]     at com.google.gwt.dev.javac.SourceFileCompilationUnit.<init>(SourceFileCompilationUnit.java:48)
     [java]     at com.google.gwt.dev.javac.CompilationUnitBuilder$ResourceCompilationUnitBuilder.makeUnit(CompilationUnitBuilder.java:154)
     [java]     at com.google.gwt.dev.javac.CompilationUnitBuilder.build(CompilationUnitBuilder.java:266)
     [java]     at com.google.gwt.dev.javac.CompilationStateBuilder$CompileMoreLater$1.run(CompilationStateBuilder.java:223)

BUILD FAILED
D:\workspace\vlp\build.xml:60: Java returned: 1

Total time: 36 seconds

I found that changing the gwt-compiler class name to the DevMode is building successfully. Using : classname="com.google.gwt.dev.DevMode" instead of classname="com.google.gwt.dev.Compiler".

EDIT : I refactored the XML above. The build.xml cleans all the bin directory. I also pointer the javacto the bin/src directory and Google Web Toolkit compiler outputs to : bin/gwt. The compiler still doesn't work...

EDIT : I downloaded the latest SDK right away from google developpers site, and overrided the old librairies found in my classpath and in my eclipse plugin. Still won't work with the ant build script.

Anybody sees what could be the problem here?


Solution

  • All I can say is that the method com.google.gwt.dev.jjs.ast.JProgram.serializeTypes(Ljava/util/List;Ljava/io/ObjectOutputStream;)V is introduced only in gwt-dev 2.4.0. It doesn't exist in gwt-dev 2.3.0.

    Which implies there are somewhere, in the classpath, two gwt-dev versions. One of them is 2.4.0, which is why com.google.gwt.dev.javac.CompilationUnitImpl is looking for that method. The other is of 2.3.0 or older, which is why that method isn't found (JProgram class was loaded by the compiler using the older version).

    Try to look them up thoroughly. Or try to start a fresh environment in which you put a good eye on what's getting in.