private void checkModuleClassPath()

in nbm-maven-plugin/src/main/java/org/apache/netbeans/nbm/NetBeansManifestUpdateMojo.java [702:797]


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