当类路径太长时,Java无法启动。在Windows上,长度限制特别短。
Gradle似乎对解决这个问题不感兴趣(尽管这是他们的责任,因为他们是Java的开发者),所以我们最终JavaExec用自己的替代方法代替了任务。
替代方法如下所示:
public class WorkingJavaExec extends JavaExec {
private static final String MATCH_CHUNKS_OF_70_CHARACTERS =
"(?<=\\G.{70})";
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void exec() {
FileCollection oldClasspath = getClasspath();
File jarFile = null;
try {
if (!oldClasspath.isEmpty()) {
try {
jarFile =
toJarWithClasspath(oldClasspath.getFiles());
setClasspath(getProject().files(jarFile));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
super.exec();
} finally {
setClasspath(oldClasspath);
if (jarFile != null) {
try {
Files.delete(jarFile.toPath());
} catch (Exception e) {
logger.warn("Couldn't delete: " + jarFile, e);
}
}
}
}
public static File toJarWithClasspath(Set<File> files)
throws IOException {
File jarFile = File.createTempFile("long-classpath", ".jar");
try (ZipOutputStream zip =
new ZipOutputStream(new FileOutputStream(jarFile))) {
zip.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
try (PrintWriter writer =
new PrintWriter(
new OutputStreamWriter(
zip, StandardCharsets.UTF_8))) {
writer.println("Manifest-Version: 1.0");
但是,使用它很麻烦,因为到处都有人可能跑来跑去JavaExec,我必须将其替换为WorkingJavaExec。新开发人员首先也不知道Gradle中存在这种陷阱,因此他们甚至不知道这是他们必须解决的问题。
在阅读Gradle的内部知识时,我看到JavaExec内部使用aJavaExecAction来执行实际的exec。
我认为也许可以通过替换它来解决问题,就像Gradle自己解决了该问题一样,也许它也可以应用于其他任务,例如Test。但是我在任何地方都找不到任何示例。(即使在其他大型项目中,您也希望遇到同样的问题!)
是否可以替代JavaExecAction,如果可以,如何替代?
守着一只汪
相关分类