[PATCH]: Still a problem with long classpath on Windows
Basil Peace
grv87 at yandex.ru
Sat Feb 9 03:46:52 UTC 2019
> a) Sign the OCA, as per http://openjdk.java.net/contribute/
Done.
> b) Put the patch somewhere on OpenJDK infra. Posting the simple patch in-line in this message would
> be good enough.
Improved patch, using URI for percent encoding:
# HG changeset patch
# User Basil Peace <grv87 at yandex.ru>
# Date 1549196743 -10800
# Sun Feb 03 15:25:43 2019 +0300
# Branch hotfix/long-classpath-absolute.v2
# Node ID fba2e675a44b2b8aaee3fd63aefe926e17fac945
# Parent 5984e353dca775da0e2208ddaed8427cd9a43acd
fix: fix long classpath issue on Windows with different drives
diff -r 5984e353dca7 -r fba2e675a44b jmh-core/src/main/java/org/openjdk/jmh/runner/Runner.java
--- a/jmh-core/src/main/java/org/openjdk/jmh/runner/Runner.java Tue Jan 22 16:22:44 2019 +0100
+++ b/jmh-core/src/main/java/org/openjdk/jmh/runner/Runner.java Sun Feb 03 15:25:43 2019 +0300
@@ -42,10 +42,13 @@
import java.io.*;
import java.lang.management.ManagementFactory;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.jar.*;
@@ -873,14 +876,25 @@
try {
tmpFile = FileUtils.tempFile("classpath.jar");
Path tmpFileDir = tmpFile.toPath().getParent();
+ String tmpFileRoot = tmpFileDir.toAbsolutePath().getRoot().toString();
StringBuilder sb = new StringBuilder();
for (String cp : cpProp.split(File.pathSeparator)) {
- String rel = tmpFileDir.relativize(new File(cp).getAbsoluteFile().toPath()).toString();
- sb.append(rel.replace('\\', '/').replace(" ", "%20"));
- if (!cp.endsWith(".jar")) {
- sb.append('/');
+ Path cpPath = Paths.get(cp).toAbsolutePath();
+ URI cpUri;
+ if (cpPath.getRoot().toString().equalsIgnoreCase(tmpFileRoot)) {
+ String rel = tmpFileDir.relativize(cpPath).toString();
+ if (File.separatorChar != '/') {
+ rel = rel.replace(File.separatorChar, '/');
+ }
+ if (!rel.endsWith(".jar")) {
+ rel = rel + '/';
+ }
+ cpUri = new URI(null, rel, null);
+ } else {
+ cpUri = cpPath.toUri();
}
+ sb.append(cpUri.toString());
sb.append(" ");
}
String classPath = sb.toString().trim();
@@ -893,8 +907,10 @@
try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(tmpFile), manifest)) {
jos.putNextEntry(new ZipEntry("META-INF/"));
}
- } catch (IOException ex) {
- // Something is wrong in file generation, give up and fall-through to usual thing
+ } catch (IOException | URISyntaxException ex) {
+ out.println("<failed to generate separate classpath JAR, caught " + ex.getClass().getSimpleName() + ": " + ex.getMessage() + ">");
+ out.println("<giving up and fall-through to usual thing>");
+ out.println("");
tmpFile = null;
}
}
--
Best regards,
Basil Peace
More information about the jmh-dev
mailing list