用大量参数编译 GWT 代码——CreateProcess 的字符限制?

Posted

技术标签:

【中文标题】用大量参数编译 GWT 代码——CreateProcess 的字符限制?【英文标题】:Compiling GWT code with a large number of parameters -- char limit on CreateProcess? 【发布时间】:2010-10-31 00:49:42 【问题描述】:

我正在尝试运行编译 GWT 的 ant 构建脚本。该脚本包含大量库,每个库都有相对较长的路径。我的 GWT 代码只涉及其中一些库;但是,将用于此目的的 lib 目录中的所有库以及我正在开发的所有其他应用程序包含在内是很方便的。这是我的构建脚本的相关部分:

<path id="gwt.project.class.path">
  <pathelement location="gen"/>
  <pathelement location="$gwt.sdk/gwt-user.jar"/>
  <fileset dir="$gwt.sdk" includes="gwt-dev*.jar"/>
  <fileset dir="$smartgwt.sdk" includes="smartgwt*.jar"/>
  <!-- Add any additional non-server libs (such as JUnit) -->
  <fileset dir="lib" includes="**/*.jar"/>
</path>

<target name="gwtc" depends="compileApp" description="GWT compile to javascript" unless="noGWTModule">
<java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
  <classpath>
    <pathelement location="src"/>
    <path refid="gwt.project.class.path"/>
  </classpath>
  <!-- add jvmarg -Xss16M or similar if you see a ***Error -->
  <jvmarg value="-Xmx256M"/>
  <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
  <arg value="$gwt.module"/>
  <arg value="-war" />
  <arg value="$gwt.gen.dir" />
</java>
</target>`

当我尝试运行它时,我收到以下错误:

java.io.IOException: CreateProcess: "C:\Program Files\Java\jdk1.5.0_11\jre\bin\java.exe" -Xmx256M -classpath "C:\Program Files\Common Files\eclipse\workspace\development\src;C:\Program Files\Common Files\eclipse\workspace\development\lib\build\hbBuildSupport.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\ehcache.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\hibernate-annotations.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\hibernate-commons-annotations.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\hibernate-entitymanager.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\hibernate-tools.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\hibernate-validator.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\hibernate3.jar;C:\Program Files\Common Files\eclipse\workspace\development\lib\db\hibernate\javassi�

似乎在编译的某个时刻,包含所有库路径的字符串都被截断了。这可能是由于 CreateProcess 的某些字符限制造成的吗?这个 CreateProcess 命令字符串在截断之前只有大约 1024 个字符,这似乎是一个很小的限制。反正有没有增加这个限制?任何想法/解决方案/解决方法都表示赞赏。

谢谢, 马尤尔

【问题讨论】:

请格式化错误,无法读取。 对不起,*** 的新手,所以必须弄清楚格式。谢谢。 【参考方案1】:

问题在于 Windows 命令行被限制为 8191 个字符,而 GWT 将每个 jar 的完整路径放在类路径中。解决此问题的唯一方法是将 jar 移动到路径较短的目录中。

您可以在 Windows 下通过创建符号链接然后在构建文件中引用该链接来执行此操作。像这样的

从c的根:

mklink /D jars C:\Program Files\Common Files\eclipse\workspace\development\lib

Wikpedia entry on windows symbolic links

【讨论】:

【参考方案2】:

对于很长的类路径,一种可能的解决方法是使用 java.ext.dirs 属性并将所有编译时依赖项(现在在类路径中引用的 JAR 文件)放到此目录中。

【讨论】:

以上是关于用大量参数编译 GWT 代码——CreateProcess 的字符限制?的主要内容,如果未能解决你的问题,请参考以下文章

GWT RPC 调用在编译模式下不起作用

多少个 GWT 服务

我在 GWT 编译器中编译源代码时遇到错误。“com.reveregroup.gwt.imagepreloader.FitImage 类型没有可用的源代码”

GWT 编译器 - 编译单元和接口

GWT 应用程序中的导航

GWT+Jetty JSP 编译器问题的解决方法? (Java 1.5 源代码级别无法识别)