in nbm-maven-plugin/src/main/java/org/apache/netbeans/nbm/NetBeansManifestUpdateMojo.java [620:701]
private void checkModuleClassPath(DependencyNode treeroot,
List<Artifact> libArtifacts,
Map<Artifact, ExamineManifest> examinerCache, List<ModuleWrapper> moduleArtifacts,
String projectCodeNameBase)
throws IOException, MojoExecutionException, MojoFailureException {
Set<String> deps = buildProjectDependencyClasses(project, libArtifacts);
deps.retainAll(allProjectClasses(project));
Set<String> own = projectModuleOwnClasses(project, libArtifacts);
deps.removeAll(own);
CollectModuleLibrariesNodeVisitor visitor = new CollectModuleLibrariesNodeVisitor(
project.getRuntimeArtifacts(), examinerCache, getLog(), treeroot, useOSGiDependencies);
treeroot.accept(visitor);
Map<String, List<Artifact>> modules = visitor.getDeclaredArtifacts();
Map<Artifact, Set<String>> moduleAllClasses = new HashMap<Artifact, Set<String>>();
for (ModuleWrapper wr : moduleArtifacts) {
if (modules.containsKey(wr.artifact.getDependencyConflictId())) {
ExamineManifest man = examinerCache.get(wr.artifact);
List<Artifact> arts = modules.get(wr.artifact.getDependencyConflictId());
Set<String>[] classes = visibleModuleClasses(arts, man, wr.dependency, projectCodeNameBase, false);
deps.removeAll(classes[0]);
moduleAllClasses.put(wr.artifact, classes[1]);
}
}
//now we have the classes that are not in public packages of declared modules,
//but are being used
if (!deps.isEmpty()) {
Map<String, List<Artifact>> transmodules = visitor.getTransitiveArtifacts();
for (ModuleWrapper wr : moduleArtifacts) {
if (transmodules.containsKey(wr.artifact.getDependencyConflictId())) {
ExamineManifest man = examinerCache.get(wr.artifact);
List<Artifact> arts = transmodules.get(wr.artifact.getDependencyConflictId());
Set<String>[] classes = visibleModuleClasses(arts, man, wr.dependency, projectCodeNameBase, true);
classes[0].retainAll(deps);
if (classes[0].size() > 0) {
String module = wr.osgi ? "OSGi bundle" : "module";
getLog().error(
"Project uses classes from transitive " + module + " " + wr.artifact.getId()
+ " which will not be accessible at runtime.");
getLog().info(
"To fix the problem, add this module as direct dependency. "
+ "For OSGi bundles that are supposed to be wrapped in NetBeans modules, "
+ "use the useOSGiDependencies=false parameter");
deps.removeAll(classes[0]);
}
classes[1].retainAll(deps);
if (classes[1].size() > 0) {
getLog().info("Private classes referenced in transitive module: " + Arrays.toString(
classes[1].toArray()));
getLog().error(
"Project depends on packages not accessible at runtime in transitive module "
+ wr.artifact.getId() + " which will not be accessible at runtime.");
deps.removeAll(classes[1]);
}
}
}
for (Map.Entry<Artifact, Set<String>> e : moduleAllClasses.entrySet()) {
List<String> strs = new ArrayList<String>(deps);
if (deps.removeAll(e.getValue())) {
strs.retainAll(e.getValue());
getLog().info("Private classes referenced in module: " + Arrays.toString(strs.toArray()));
getLog().error("Project depends on packages not accessible at runtime in module " + e.getKey().
getId());
}
}
if (verifyRuntime.equalsIgnoreCase(FAIL)) {
if (!deps.isEmpty()) {
throw new MojoFailureException(
"Uncategorized problems with NetBeans dependency verification "
+ "(maybe MNBMODULE-102 or wrong maven dependency metadata). "
+ "Supposedly external classes are used in the project's binaries "
+ "but the classes are not found on classpath. Class usages: "
+ deps);
} else {
throw new MojoFailureException(
"See above for failures in runtime NetBeans dependencies verification.");
}
}
}
}