【问题标题】:Compiling GWT 2.6.1 at Java 7 source level在 Java 7 源代码级别编译 GWT 2.6.1
【发布时间】:2015-07-21 00:39:12
【问题描述】:

我最近将我的 GWT 项目更新到 2.6.1,并开始使用 Java 7 语法,因为 2.6 现在支持 Java 7。

但是,当我尝试编译时,我收到编译器错误,例如

[ERROR] Line 42: '<>' operator is not allowed for source level below 1.7

完整输出

Compiling module com.Project
   Validating units:
      Ignored 85 units with compilation errors in first pass.
Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
   Computing all possible rebind results for 'com.google.gwt.useragent.client.UserAgentAsserter'
      Rebinding com.google.gwt.useragent.client.UserAgentAsserter
         Checking rule <generate-with class='com.google.gwt.editor.rebind.SimpleBeanEditorDriverGenerator'/>
            [WARN] Detected warnings related to 'com.google.gwt.editor.client.SimpleBeanEditorDriver'.   Are validation-api-<version>.jar and validation-api-<version>-sources.jar on the classpath?
            Specify -logLevel DEBUG to see all errors.
            [WARN] Unknown type 'com.google.gwt.editor.client.SimpleBeanEditorDriver' specified in deferred binding rule
   [ERROR] Errors in 'file:/C:/workspace/Project/src/com/project/ProjectFile.java'
      [ERROR] Line 42: '<>' operator is not allowed for source level below 1.7
   [ERROR] Errors in 'file:/C:/workspace/Project/src/com/project/AnotherProjectFile.java'
      [ERROR] Line 188: Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted
C:\workspace\Project\build.xml:51: Java returned: 1
    at org.apache.tools.ant.taskdefs.Java.execute(Java.java:111)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.Main.start(Main.java:180)
    at org.apache.tools.ant.Main.main(Main.java:268)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:30)
C:\workspace\Project\build.xml:51: Java returned: 1
    at org.apache.tools.ant.taskdefs.Java.execute(Java.java:111)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.Main.start(Main.java:180)
    at org.apache.tools.ant.Main.main(Main.java:268)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:30)
C:\workspace\Project\build.xml:51: Java returned: 1
    at org.apache.tools.ant.taskdefs.Java.execute(Java.java:111)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.Main.start(Main.java:180)
    at org.apache.tools.ant.Main.main(Main.java:268)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:30)

如何指定 GWT 编译器以 1.7 为目标?我的印象是默认情况下它会这样做,但我想不会。我已经尝试清理项目,包括删除 gwt-unitCache 目录但无济于事。

这是我的 Ant 编译目标。

<target name="compile" depends="prepare">
    <javac includeantruntime="false"
           debug="on"
           debuglevel="lines,vars,source"
           srcdir="${src.dir}"
           destdir="${build.dir}"
           source="7"
           target="7">
        <classpath refid="project.classpath"/>
    </javac>
</target>

<target name="gwt-compile" depends="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="${src.dir}"/>
            <pathelement location="${build.dir}"/>
            <path refid="project.classpath"/>
        </classpath>
        <jvmarg value="-Xmx256M"/>
        <arg value="-sourceLevel"/><arg value="7"/>
        <arg value="${gwt.module.name}"/>
    </java>
</target>

【问题讨论】:

  • 你在使用 Eclipse 吗?
  • 我正在使用 IntelliJ。我可以通过 IntelliJ 运行配置很好地构建和启动应用程序,但是当我尝试通过发布的 Ant build.xml 目标进行编译时,我只会收到此错误。
  • 可能是您的 IDE 指向 JAVA 6。只需将其指向 Java 7 并按照此处列出的步骤Executing Ant Target。它也会帮助你Configuring Global, Project and Module SDKs
  • 试试&lt;javac source="1.7" ...阅读更多Problem with compiling a gwt project with ant
  • 我确实有 IntelliJ 指向 Java 7(因此它能够通过运行配置进行编译)。尝试通过 Ant 编译(在 IntelliJ 中或在常规命令行中)时,我遇到了这个问题。我可以确认 JAVA_HOME 指向 Java 7(javac -version 返回 Java 1.7),添加 &lt;javac source="1.7" 也没有帮助。

标签: java gwt ant


【解决方案1】:

GWT 编译器(和 SuperDevMode 的 CodeServer)有一个 -sourceLevel 参数,可用于指定语言级别,类似于 javac-source 参数。

-sourceLevel 的默认值取决于您当前的 JVM,因此如果您使用 JDK 1.7,它应该默认为 Java 7。

最好将-sourceLevel 7(或1.7)明确传递给GWT,并将-source 7(或1.7)传递给javac(在&lt;javac&gt; Ant 任务中使用source="7" )

【讨论】:

  • 如何将-sourceLevel 7“传递给GWT 编译器”?我似乎找不到合适的 Ant 属性。
  • &lt;arg value="-sourceLevel"/&gt;&lt;arg value="7"/&gt;
  • 我在gwt-compile 目标中的&lt;arg value="${gwt.module.name}"/&gt; 下添加了它,但它仍然没有解决问题。
  • GWT 模块名称必须在参数列表中排在最后(请参阅gwtproject.org/doc/latest/…)。把它们放在后面应该会使任务出错;我应该明白您看到的错误来自另一个 Ant 任务/目标吗?确保您source="7" target="7" 放在您的&lt;javac&gt; 任务上。也许用你尝试过但不起作用的方法更新你的问题,可能还有来自 Ant 和完整 build.xml 的完整输出(使用 pastebin 或类似方法来分享它们)
  • 我已经更新了我的答案,包括我对编译目标所做的更改,以及完整的输出。
【解决方案2】:

我们只花了两天时间寻找一个类似的错误,结果证明这是由于使用错误版本的 java (1.6) 对 gwt 代码的部分编译造成的。这在gwt-unitCache 中留下了一些数据,这以某种方式迫使 gwt 编译器继续期望代码为 1.6(因此出现菱形运算符警告),即使 java 版本已更改为 1.7。问题已通过删除gwt-unitCache解决。

我知道 OP 说他已经尝试过了,但并没有解决他的问题,但我想提一下,因为它可能会帮助其他有类似问题的人。此外,这也可能表明如果 OP 正在使用其他预编译的 gwt 代码,这可能会影响 gwt 编译器使用的 java 版本。

【讨论】:

  • 这解决了问题!虽然我最初确实删除了 gwt-unitCache,但在按照 Thomas Broyer 的建议明确设置 Ant 任务中的源级别目标后,我没有尝试删除它。
【解决方案3】:

最终,解决方案是结合了 zpon 和 Thomas Broyer 的答案。

首先,删除gwt-unitCache 目录。

然后,在javac Ant 任务中,显式指定源级别

<javac includeantruntime="false"
               debug="on"
               debuglevel="lines,vars,source"
               srcdir="${src.dir}"
               destdir="${build.dir}"
               source="7"
               target="7">
   <classpath refid="project.classpath"/>
</javac>

同时指定 GWT 编译器的源代码级别

<java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
    <classpath>
        <pathelement location="${src.dir}"/>
        <pathelement location="${build.dir}"/>
        <path refid="project.classpath"/>
    </classpath>
    <jvmarg value="-Xmx256M"/>
    <arg value="-sourceLevel"/><arg value="7"/>
    <arg value="${gwt.module.name}"/>
</java>

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2012-12-12
    相关资源
    最近更新 更多