我们致力于为软件公司重写构建系统。他们的构建有很多生成器,使用各种第三方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
答案 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自己没有尝试的东西,我建议你也避免这样做。