[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