6725230: Java Compilation with Jsr199 ignores Class-Path in manifest
Reviewed-by: jjg, mcimadamore
Contributed-by: vicente.romero@oracle.com
--- 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");
+ }
+ }
+}