6725230: Java Compilation with Jsr199 ignores Class-Path in manifest
authorjjg
Thu, 25 Oct 2012 13:33:27 -0700
changeset 14360 2a8304e421ed
parent 14359 d4099818ab70
child 14361 2814fa6977ac
6725230: Java Compilation with Jsr199 ignores Class-Path in manifest Reviewed-by: jjg, mcimadamore Contributed-by: vicente.romero@oracle.com
langtools/src/share/classes/com/sun/tools/javac/file/Locations.java
langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java
--- a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java	Thu Oct 25 11:09:36 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java	Thu Oct 25 13:33:27 2012 -0700
@@ -420,14 +420,10 @@
             if (!options.contains(option))
                 return false;
             searchPath = value == null ? null :
-                    Collections.unmodifiableCollection(computePath(value));
+                    Collections.unmodifiableCollection(createPath().addFiles(value));
             return true;
         }
 
-        protected Path computePath(String value) {
-            return new Path().addFiles(value);
-        }
-
         @Override
         Collection<File> getLocation() {
             return searchPath;
@@ -439,10 +435,18 @@
             if (files == null) {
                 p = computePath(null);
             } else {
-                p = new Path().addFiles(files);
+                p = createPath().addFiles(files);
             }
             searchPath = Collections.unmodifiableCollection(p);
         }
+
+        protected Path computePath(String value) {
+            return createPath().addFiles(value);
+        }
+
+        protected Path createPath() {
+            return new Path();
+        }
     }
 
     /**
@@ -477,11 +481,15 @@
             // Default to current working directory.
             if (cp == null) cp = ".";
 
+            return createPath().addFiles(cp);
+        }
+
+        @Override
+        protected Path createPath() {
             return new Path()
-                .expandJarClassPaths(true)        // Only search user jars for Class-Paths
-                .emptyPathDefault(new File("."))  // Empty path elt ==> current directory
-                .addFiles(cp);
-            }
+                .expandJarClassPaths(true)         // Only search user jars for Class-Paths
+                .emptyPathDefault(new File("."));  // Empty path elt ==> current directory
+        }
 
         private void lazy() {
             if (searchPath == null)
@@ -591,7 +599,6 @@
             String extdirsOpt = optionValues.get(EXTDIRS);
             String xbootclasspathPrependOpt = optionValues.get(XBOOTCLASSPATH_PREPEND);
             String xbootclasspathAppendOpt = optionValues.get(XBOOTCLASSPATH_APPEND);
-
             path.addFiles(xbootclasspathPrependOpt);
 
             if (endorseddirsOpt != null)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java	Thu Oct 25 13:33:27 2012 -0700
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6725230
+ * @summary Test to make sure that java Compilation with JSR199 does not ignore
+ * Class-Path in manifest
+ * @author vicente.romero
+ * @build TestCompileJARInClassPath
+ * @run main TestCompileJARInClassPath
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+import javax.tools.DiagnosticCollector;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+
+public class TestCompileJARInClassPath {
+
+    public static void main(String args[]) throws Exception {
+        TestCompileJARInClassPath theTest = new TestCompileJARInClassPath();
+        theTest.run();
+    }
+
+    void run() throws Exception {
+        try {
+            clean();
+            generateFilesNeeded();
+            compileWithJSR199();
+        } finally {
+            clean();
+        }
+    }
+
+    void writeFile(String f, String contents) throws IOException {
+        PrintStream s = new PrintStream(new FileOutputStream(f));
+        s.println(contents);
+        s.close();
+    }
+
+    void rm(String filename) throws Exception {
+        File f = new File(filename);
+        f.delete();
+        if (f.exists())
+            throw new Exception(filename + ": couldn't remove");
+    }
+
+    void clean() throws Exception {
+        rm("C1.java");
+        rm("C1.class");
+        rm("C1.jar");
+
+        rm("C2.java");
+        rm("C2.class");
+        rm("C2.jar");
+        rm("MANIFEST.MF");
+
+        rm("C3.java");
+        rm("C3.class");
+    }
+
+    void generateFilesNeeded() throws Exception {
+        sun.tools.jar.Main jarGenerator = new sun.tools.jar.Main(System.out, System.err, "jar");
+
+        writeFile("C1.java",
+                  "public class C1 {public static void f() {}}");
+        com.sun.tools.javac.Main.compile(new String[]{"C1.java"});
+        jarGenerator.run(new String[] {"cf", "C1.jar", "C1.class"});
+
+        writeFile("C2.java",
+                  "public class C2 {public static void g() {}}");
+        writeFile("MANIFEST.MF",
+                  "Manifest-Version: 1.0\n" +
+                  "Class-Path: C1.jar\n" +
+                  "Main-Class: C2");
+        com.sun.tools.javac.Main.compile(new String[]{"C2.java"});
+        jarGenerator.run(new String[] {"cfm", "C2.jar", "MANIFEST.MF", "C2.class"});
+
+        writeFile("C3.java",
+                  "public class C3 {public static void h() {C2.g(); C1.f();}}");
+    }
+
+    void compileWithJSR199() throws IOException {
+        String cpath = "C2.jar";
+        File clientJarFile = new File(cpath);
+        File sourceFileToCompile = new File("C3.java");
+
+
+        javax.tools.JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
+        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
+        StandardJavaFileManager stdFileManager = javac.getStandardFileManager(diagnostics, null, null);
+
+        List<File> files = new ArrayList<>();
+        files.add(clientJarFile);
+
+        stdFileManager.setLocation(StandardLocation.CLASS_PATH, files);
+
+        Iterable<? extends JavaFileObject> sourceFiles = stdFileManager.getJavaFileObjects(sourceFileToCompile);
+
+        if (!javac.getTask(null, stdFileManager, diagnostics, null, null, sourceFiles).call()) {
+            throw new AssertionError("compilation failed");
+        }
+    }
+}