diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/classpath/BootClassPathImplementation.java b/java.api.common/src/org/netbeans/modules/java/api/common/classpath/BootClassPathImplementation.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/classpath/BootClassPathImplementation.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/classpath/BootClassPathImplementation.java @@ -75,12 +75,16 @@ private List resourcesCache; private long eventId; private PropertyChangeSupport support = new PropertyChangeSupport(this); + private ClassPath endorsedClassPath; - BootClassPathImplementation(PropertyEvaluator evaluator) { + BootClassPathImplementation(PropertyEvaluator evaluator, ClassPath endorsedClassPath) { assert evaluator != null; - + this.endorsedClassPath = endorsedClassPath; this.evaluator = evaluator; evaluator.addPropertyChangeListener(WeakListeners.propertyChange(this, evaluator)); + if (endorsedClassPath != null) { + endorsedClassPath.addPropertyChangeListener(this); + } } /** @@ -97,6 +101,11 @@ JavaPlatform jp = findActivePlatform(); final List result = new ArrayList(); + if (endorsedClassPath != null) { + for (ClassPath.Entry entry : endorsedClassPath.entries()) { + result.add(ClassPathSupport.createResource(entry.getURL())); + } + } if (jp != null) { // TODO: may also listen on CP, but from Platform it should be fixed final ClassPath cp = jp.getBootstrapLibraries(); @@ -154,6 +163,8 @@ resetCache(); } } + } else if (endorsedClassPath != null && evt.getSource() == endorsedClassPath) { + resetCache(); } } diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/classpath/ClassPathProviderImpl.java b/java.api.common/src/org/netbeans/modules/java/api/common/classpath/ClassPathProviderImpl.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/classpath/ClassPathProviderImpl.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/classpath/ClassPathProviderImpl.java @@ -49,6 +49,7 @@ import org.netbeans.api.project.ProjectManager; import org.netbeans.api.project.SourceGroup; import org.netbeans.modules.java.api.common.SourceRoots; +import org.netbeans.modules.java.api.common.project.ProjectProperties; import org.netbeans.spi.java.classpath.ClassPathFactory; import org.netbeans.spi.java.classpath.ClassPathProvider; import org.netbeans.spi.java.project.classpath.support.ProjectClassPathSupport; @@ -73,7 +74,8 @@ private String[] javacTestClasspath = new String[]{"javac.test.classpath"}; //NOI18N private String[] runClasspath = new String[]{"run.classpath"}; //NOI18N private String[] runTestClasspath = new String[]{"run.test.classpath"}; //NOI18N - + private String[] endorsedClasspath = new String[]{ProjectProperties.ENDORSED_CLASSPATH}; //NOI18N + private final AntProjectHelper helper; private final File projectDirectory; private final PropertyEvaluator evaluator; @@ -90,8 +92,9 @@ * 5 - test execute class path * 6 - execute class path for dist.jar * 7 - boot class path + * 8 - endorsed class path */ - private final ClassPath[] cache = new ClassPath[8]; + private final ClassPath[] cache = new ClassPath[9]; private final Map dirCache = new HashMap(); @@ -118,6 +121,25 @@ String buildClassesDir, String distJar, String buildTestClassesDir, String[] javacClasspath, String[] javacTestClasspath, String[] runClasspath, String[] runTestClasspath) { + this(helper, + evaluator, + sourceRoots, + testSourceRoots, + buildClassesDir, + distJar, + buildTestClassesDir, + javacClasspath, + javacTestClasspath, + runClasspath, + runTestClasspath, + new String[]{ProjectProperties.ENDORSED_CLASSPATH}); + } + + public ClassPathProviderImpl(AntProjectHelper helper, PropertyEvaluator evaluator, + SourceRoots sourceRoots, SourceRoots testSourceRoots, + String buildClassesDir, String distJar, String buildTestClassesDir, + String[] javacClasspath, String[] javacTestClasspath, String[] runClasspath, + String[] runTestClasspath, String[] endorsedClasspath) { this(helper, evaluator, sourceRoots, testSourceRoots); this.buildClassesDir = buildClassesDir; this.distJar = distJar; @@ -126,6 +148,7 @@ this.javacTestClasspath = javacTestClasspath; this.runClasspath = runClasspath; this.runTestClasspath = runTestClasspath; + this.endorsedClasspath = endorsedClasspath; } @@ -293,6 +316,17 @@ return cp; } + private synchronized ClassPath getEndorsedClasspath() { + ClassPath cp = cache[8]; + if ( cp == null) { + cp = ClassPathFactory.createClassPath( + ProjectClassPathSupport.createPropertyBasedClassPathImplementation( + projectDirectory, evaluator, endorsedClasspath)); // NOI18N + cache[8] = cp; + } + return cp; + } + private ClassPath getSourcepath(FileObject file) { int type = getType(file); return this.getSourcepath(type); @@ -320,7 +354,7 @@ private synchronized ClassPath getBootClassPath() { ClassPath cp = cache[7]; if ( cp== null ) { - cp = ClassPathFactory.createClassPath(ClassPathSupportFactory.createBootClassPathImplementation(evaluator)); + cp = ClassPathFactory.createClassPath(ClassPathSupportFactory.createBootClassPathImplementation(evaluator, getEndorsedClasspath())); cache[7] = cp; } return cp; @@ -335,6 +369,8 @@ return getSourcepath(file); } else if (type.equals(ClassPath.BOOT)) { return getBootClassPath(); + } else if (type.equals(ClassPathSupport.ENDORSED)) { + return getEndorsedClasspath(); } else { return null; } @@ -389,6 +425,9 @@ } public String[] getPropertyName (final SourceRoots roots, final String type) { + if (ClassPathSupport.ENDORSED.equals(type)) { + return endorsedClasspath; + } if (roots.isTest()) { if (ClassPath.COMPILE.equals(type)) { return javacTestClasspath; @@ -414,6 +453,9 @@ } public String[] getPropertyName (SourceGroup sg, String type) { + if (ClassPathSupport.ENDORSED.equals(type)) { + return endorsedClasspath; + } FileObject root = sg.getRootFolder(); FileObject[] path = getPrimarySrcPath(); for (int i=0; iplatform.active + * property and given endorsed classpath which will have precedence of platform classpath. + * @param evaluator project's property evaluator + * @param endorsedClassPath endorsed classpath to prepend to boot classpath + * @return classpath implementation + */ + public static ClassPathImplementation createBootClassPathImplementation(PropertyEvaluator evaluator, ClassPath endorsedClassPath) { + return new BootClassPathImplementation(evaluator, endorsedClassPath); } /** diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/project/ProjectProperties.java b/java.api.common/src/org/netbeans/modules/java/api/common/project/ProjectProperties.java --- a/java.api.common/src/org/netbeans/modules/java/api/common/project/ProjectProperties.java +++ b/java.api.common/src/org/netbeans/modules/java/api/common/project/ProjectProperties.java @@ -59,6 +59,7 @@ public static final String RUN_TEST_CLASSPATH = "run.test.classpath"; // NOI18N public static final String BUILD_CLASSES_DIR = "build.classes.dir"; //NOI18N public static final String BUILD_TEST_CLASSES_DIR = "build.test.classes.dir"; // NOI18N + public static final String ENDORSED_CLASSPATH = "endorsed.classpath"; // NOI18N public static final String[] WELL_KNOWN_PATHS = new String[] { "${" + JAVAC_CLASSPATH + "}", // NOI18N @@ -66,6 +67,7 @@ "${" + RUN_CLASSPATH + "}", // NOI18N "${" + RUN_TEST_CLASSPATH + "}", // NOI18N "${" + BUILD_CLASSES_DIR + "}", // NOI18N + "${" + ENDORSED_CLASSPATH + "}", // NOI18N "${" + BUILD_TEST_CLASSES_DIR + "}" // NOI18N }; diff --git a/web.project/src/org/netbeans/modules/web/project/resources/build-impl.xsl b/web.project/src/org/netbeans/modules/web/project/resources/build-impl.xsl --- a/web.project/src/org/netbeans/modules/web/project/resources/build-impl.xsl +++ b/web.project/src/org/netbeans/modules/web/project/resources/build-impl.xsl @@ -321,6 +321,10 @@ + + + + @@ -455,6 +459,7 @@ + @@ -532,6 +537,7 @@ ${platform.java} +