【问题标题】:Compiling an eclipse GWT project from the command line, without eclipse: compile error从命令行编译一个eclipse GWT项目,没有eclipse:编译错误
【发布时间】:2013-01-22 14:40:32
【问题描述】:

我们在 Eclipse 中获得了一个 GWT 项目,否则它可以工作。 现在我想要一个在服务器上运行的脚本,它从源代码管理中提取最新版本并在服务器上编译并部署它。 这将为我们节省大量手动工作,并允许我们在带宽有限的连接上部署新版本(因为我们不必将应用程序上传到服务器)。

拉取最新版本的源代码后,脚本尝试使用以下命令编译代码:

java -cp "/path/eclipse/plugins/com.google.gwt.eclipse.sdkbundle_2.5.0.v201211121240-rel-r42/gwt-2.5.0/*:/path/company/projects/pull-compile-deploy/X/X/src:/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/*" com.google.gwt.dev.Compiler nl.company.projects.X

Compiling module nl.company.projects.X
   Finding entry point classes
      [ERROR] Unable to find type 'nl.company.projects.X.client.XMain'
         [ERROR] Hint: Previous compiler errors may have made this type unavailable
         [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly

所有源代码都在/path/company/projects/pull-compile-deploy/X/X/src 中,所有使用的.jars(GWT 除外)都在/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/ 中。显然出了点问题。

问题:文件/path/company/projects/pull-compile-deploy/X/X/src/nl/company/projects/X/client/XMain.java 确实存在,并且应该在类路径中吗?! 任何人知道这里可能出了什么问题吗? 是否有可能在某些日志中确切地看到 eclipse 为编译而执行的命令?我查看了eclipse可以导出的build.xml,但似乎不包含编译用于生产的目标。

其他:显然 GWT 期望 X.gwt.xml 位于 /path/company/projects/pull-compile-deploy/X/X/src/nl/company/project/X.gwt.xml,而 eclipse 将其放在 /path/company/projects/pull-compile-deploy/X/X/src/nl/company/project/X/X.gwt.xml 中(即嵌套更深的一个目录),我通过创建符号链接解决了这个问题。

进一步编辑: 由于一个答案集中在我如何调用编译工具,我已经在 Ant 中重写了它,见下文。 当然,问题仍然存在。

<!-- Compile the source using javac. -->
<target name="compile" depends="init">
    <javac srcdir="src/" destdir="bin/">
        <classpath refid="project.classpath"/>
    </javac>
</target>


<!-- Use the GWT-compiler. -->
<target name="gwt-compile" depends="compile">
    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
        <classpath>
            <path refid="project.classpath"/>
            <pathelement location="src/"/>
            <pathelement location="bin/"/>
        </classpath>
        <jvmarg value="-Xmx512M"/>
        <arg value="${module.name}"/>
    </java>
</target>

上面的 Ant 脚本有什么问题吗? module.name = nl.company.projects.X 和带有 refid="project.classpath" 的路径包含所有使用的库以及 GWT 库(gwt-user.jar、gwt-dev.jar 和 validation-api-1.0.0.GA(-source).jar)。

XMain 类不继承任何东西(除了从 Object 继承)并且只实现 EntryPoint(包含在 gwt-user.jar 中)。所以我认为这个问题与编译器给出的第二个提示无关。

有什么想法吗?

【问题讨论】:

    标签: java eclipse gwt command-line compilation


    【解决方案1】:

    GWT 要求您 javac 您的课程,它需要 *.java*.class 文件。

    情况并非总是如此,并且应该在未来改回(例如参见https://code.google.com/p/google-web-toolkit/issues/detail?id=7602),但目前情况是这样:您需要先javac,然后才能com.google.gwt.dev.Compiler

    javac -cp "/path/eclipse/plugins/com.google.gwt.eclipse.sdkbundle_2.5.0.v201211121240-rel-r42/gwt-2.5.0/*:/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/*" -sourcepath /path/company/projects/pull-compile-deploy/X/X/src /path/company/projects/pull-compile-deploy/X/X/src/nl/company/projects/X.java -d /path/company/projects/pull-compile-deploy/X/X/bin
    
    java -cp "/path/eclipse/plugins/com.google.gwt.eclipse.sdkbundle_2.5.0.v201211121240-rel-r42/gwt-2.5.0/*:/path/company/projects/pull-compile-deploy/X/X/src:/path/company/projects/pull-compile-deploy/X/X/bin:/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/*" com.google.gwt.dev.Compiler nl.company.projects.X
    

    (使用前请仔细检查以上命令)

    编辑:(针对您的“问题”回复X.gwt.xml):GWT 预计 X.gwt.xml 位于nl/company/projects/X.gwt.xml,因为这就是你告诉它使用:module.name = nl.company.projects.x。如果文件位于nl/company/projects/X/X.gt.xml,则使用nl.company.projects.X.X 作为模块名称。在这里使用符号链接可能是问题所在:模块的源路径(在https://developers.google.com/web-toolkit/doc/latest/DevGuideOrganizingProjects#DevGuideModuleXml 搜索&lt;source)将是nl/company/projects/client,因此不会包含nl/company/projects/X/client,您的XMain 类生活;这对于 GWT 编译器不可用


    也就是说,我完全同意 SSR:使用像样的构建工具:Ant、Maven、Gradle、Make 等等,它会让你的生活变得更轻松。管理依赖项(Ant+Ivy、Maven、Gradle)的构建工具甚至更好。

    【讨论】:

    • 谢谢,我不知道我必须先使用常规编译器进行编译。然而,这似乎并没有解决我的问题。
    • 符号链接是问题所在。真的很想对我的大脑进行一些版本控制,因为我不知道为什么我认为这是必要的/一个好主意。谢谢!
    【解决方案2】:

    你为什么要让自己经历这样的非标准构建练习。

    如果是非学术项目,则使用 maven。如果你觉得 maven 很困难,那就用 ant。

    两种类型的示例均由 GWT 团队提供 - http://code.google.com/p/google-web-toolkit/source/browse/#svn%2Ftrunk%2Fsamples

    注意 - maven 有插件来完成您以 标准化 方式尝试的大部分工作。

    【讨论】:

    • 这有点侮辱,无论如何都没有回答 OPs 的原始问题。建议 maven 可能会使这更容易,只要它与问题的实际答案配对即可。
    • 我已经分享了 GWT 示例中的示例链接,用于基于 ant 和 maven 的项目!!!! T.Broyer 在 GWT 团队工作,并在所选答案的末尾提到 ant/maven/gradle 是选择!!!
    • 我发现命令行选项很棒。我需要触发构建/编译以及易于管理的附加要求。我不会为了进行自定义构建处理而陷入 maven 地狱。所以我发现这个选项很容易获得。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多