使用ant运行32位java时的类路径长度

时间:2014-01-01 11:01:22

标签: java maven ant jvm classpath

我们致力于为软件公司重写构建系统。他们的构建有很多生成器,使用各种第三方deps,其中一个是整个Weblogic。我们有一个“depchain”pom,它包含所有weblogic依赖项。当我们在类路径中使用这个depchain运行某种类型的生成器时,我们在32位JVM上的CreateProcess error=206, The filename or extension is too long上失败,但是一切都适用于64.很明显,它在类路径的长度上失败,因为每个jar在depchain中是.m2文件夹中的绝对位置(以前他们没有理解二进制存储库,类路径是一个简单的目录)。我们使用简单的antrun插件执行来执行生成器。有没有办法让它在32位java上运行,除了修剪类路径?


UPD 经过一天的出汗,我终于使用了@Evgeniy Dorofeev的想法。我无法使用mvn插件,因为创建我运行的工件的部分正在执行此生成器。所以我不得不使用ant来构建一个包含这个巨型类路径字符串的清单唯一的jar。 classpath字符串使用绝对路径的问题,我不得不将其转换为相对(MANIFEST.MF格式)。这是它自己的头痛:

        <var name="relative.classpath.property"/>
        <for param="curr.dep" list="${combined_classpath}" delimiter=";">
            <sequential>
                <local name="relative.dep.location"/>
                <property name="relative.dep.location" relative="true" basedir="${project.build.directory}" value="@{curr.dep}"/>

                <local name="classpath.hack.temp"/>
                <propertyregex property="classpath.hack.temp"
                    input="${relative.dep.location}"
                    regexp="\\"
                    replace="\/"
                    default="${relative.dep.location}"
                    global="true"/>


                <var name="relative.classpath.property" value="${relative.classpath.property} ${classpath.hack.temp}"/>
            </sequential>
        </for>

以后要用这些东西建立一个罐子:

<jar jarfile="${project.build.directory}/classpath.hack.jar">
  <manifest>
    <attribute name="Class-Path" value="${relative.classpath.property}"/>
  </manifest>
</jar>

然后我的<java>在类路径中只有${project.build.directory}/classpath.hack.jar

2 个答案:

答案 0 :(得分:1)

您可以将Class-Path attr添加到您的应用jar清单中,这就是我们在Maven中的操作方式

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    ...
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
        </manifest>
      </archive>
    </configuration>
    ...
  </plugin>

这样,类路径长度没有限制

答案 1 :(得分:0)

Java的64位javac生成与32位版本相同的代码,因此除非您只有32位操作系统,否则不需要使用Java 32位。

Java 6添加了directory/*以将所有JARS包含在目录中,这可以显着缩短类路径。

您的问题的根源是所有32位程序都在Windows XP / 32位仿真器中运行,并且具有所有相同的限制,例如最大命令行长度和环境变量长度。改变/修复这是MS自己没有尝试的东西,我建议你也避免这样做。