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