# HG changeset patch # User jjg # Date 1351197207 25200 # Node ID ea2616a6bd01b76c1b99dfa1e174dd4b531c385d # Parent c002fdee76fd0d084d5c5bb87388141da5b57a7b 6725230: Java Compilation with Jsr199 ignores Class-Path in manifest Reviewed-by: jjg, mcimadamore Contributed-by: vicente.romero@oracle.com diff -r c002fdee76fd -r ea2616a6bd01 src/share/classes/com/sun/tools/javac/file/Locations.java --- a/src/share/classes/com/sun/tools/javac/file/Locations.java Thu Oct 25 11:09:36 2012 -0700 +++ b/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 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) diff -r c002fdee76fd -r ea2616a6bd01 test/tools/javac/Paths/TestCompileJARInClassPath.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/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 diagnostics = new DiagnosticCollector<>(); + StandardJavaFileManager stdFileManager = javac.getStandardFileManager(diagnostics, null, null); + + List files = new ArrayList<>(); + files.add(clientJarFile); + + stdFileManager.setLocation(StandardLocation.CLASS_PATH, files); + + Iterable sourceFiles = stdFileManager.getJavaFileObjects(sourceFileToCompile); + + if (!javac.getTask(null, stdFileManager, diagnostics, null, null, sourceFiles).call()) { + throw new AssertionError("compilation failed"); + } + } +}