我有一个IJavaProject
并且我需要在这个项目的类路径上找到资源,即相当于getClassLoader().getResources()
(注意:这个调用返回Enumeration<URL>
而不是单个URL
)。
如何从 Eclipse 包/插件检查 Java 项目的类路径,例如查找包含的所有类路径条目log4j.xml
?
用于getPackageFragmentRoots()
获取类路径中条目的等效项。对于每个根,您可以调用getNonJavaResources()
以获取该根下的非 java 事物,并且您可以getChildren()
递归调用以获取子项(以 java 层次结构的方式)。最终,那些间接遍历的子文件将是 java 源文件,您可以通过向它们发送getUnderlyingResource()
方法来确认它们。
这是一些代码:
private Collection<String> keys( IJavaProject project, String[] bundleNames ) throws CoreException, IOException {
Set<String> keys = Sets.newLinkedHashSet();
for( String bundleName : bundleNames ) {
IPath path = new Path( toResourceName( bundleName ) );
boolean found = false;
IPackageFragmentRoot[] packageFragmentRoots = project.getPackageFragmentRoots();
for( IPackageFragmentRoot root : packageFragmentRoots ) {
found |= collectKeys( root, path, keys );
}
if( ! found ) {
throw new BundleNotFoundException( bundleName );
}
}
return keys;
}
private boolean collectKeys( IPackageFragmentRoot root, IPath path, Set<String> keys ) throws CoreException, IOException {
IPath fullPath = root.getPath().append( path );
System.out.println( "fullPath=" + fullPath );
IFile file = root.getJavaProject().getProject().getFile( fullPath.removeFirstSegments( 1 ) );
System.out.println( "file=" + fullPath );
if( ! file.exists() ) {
return false;
}
log.debug( "Loading " + file );
InputStream stream = file.getContents( true );
try {
Properties p = load( file.getFullPath().toString(), stream );
keys.addAll( keySet( p ) );
} finally {
stream.close();
}
return true;
}
protected String toResourceName( String bundleKey ) {
String path = bundleKey.replace( '.', '/' );
return path + ".properties";
}