2

我们在 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 的东西)都在 .jar 中/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确实存在并且imho应该在类路径中?!任何人知道这里可能出了什么问题吗?是否有可能在某些日志中准确地看到 eclipse 为编译而执行的命令?我查看了 eclipse 可以导出的 build.xml,但似乎不包含要为生产编译的目标。

别的东西:显然 GWT 期望X.gwt.xml是 at /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 中)。所以我不认为这个问题与编译器给出的第二个提示有关。

有任何想法吗?

4

2 回答 2

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.xmlnl.company.projects.X.X用作模块名称。在此处使用符号链接可能会出现问题:模块的源路径(<sourcehttps://developers.google.com/web-toolkit/doc/latest/DevGuideOrganizingProjects#DevGuideModuleXml搜索)将nl/company/projects/client因此而获胜'不包括nl/company/projects/X/client你的XMain班级住在哪里; 这是 GWT 编译器无法使用的。


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

于 2013-01-22T15:00:07.727 回答
-1

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

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

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

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

于 2013-01-22T14:47:31.653 回答