private void checkModuleClassPath()

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.");
                }
            }
        }
    }