Skip to content

Unable to resolve UNC-based classpath entries #705

@jdeppe-pivotal

Description

@jdeppe-pivotal

Hello Luke!

I have come across a problem where UNC-based classpath entries are not resolved correctly. I think I've boiled it down to this test scenario:

public class Main {
    public static void main(String[] args) throws Exception {
        String packagesToScan = args[0];
        String interfaceClass = args[1];

        ScanResult scanResult = new ClassGraph().acceptPackages(packagesToScan)
                .ignoreParentClassLoaders()
                .overrideClasspath("\\\\192.168.216.1\\workspace\\gemfire\\geode-assembly\\build\\install\\apache-geode\\lib\\spring-shell-1.2.0.RELEASE.jar")
                .enableClassInfo()
                .enableRealtimeLogging()
                .scan(1);

        ClassInfoList classInfoList = scanResult.getClassesImplementing(interfaceClass);

        classInfoList.forEach(x -> System.out.println(x.getName()));
    }
}

When run with these args:

org.springframework.shell org.springframework.shell org.springframework.shell.core.Converter

Produces this log:

Sep 26, 2022 2:09:52 PM nonapi.io.github.classgraph.utils.LogNode flush
INFO: 2022-09-26T14:09:52.636-0700	ClassGraph	ClassGraph version 4.8.149
2022-09-26T14:09:52.637-0700	ClassGraph	Operating system: Windows 10 10.0 amd64
2022-09-26T14:09:52.637-0700	ClassGraph	Java version: 1.8.0_345 / 1.8.0_345-b01 (BellSoft)
2022-09-26T14:09:52.638-0700	ClassGraph	Java home: C:\Users\IEUser\.jdks\liberica-1.8.0_345\jre
2022-09-26T14:09:52.648-0700	ClassGraph	JRE rt.jar:
2022-09-26T14:09:52.648-0700	ClassGraph	-- C:/Users/IEUser/.jdks/liberica-1.8.0_345/jre/lib/rt.jar
2022-09-26T14:09:52.658-0700	ClassGraph	ScanSpec:
2022-09-26T14:09:52.658-0700	ClassGraph	-- packageAcceptReject: accept: ["org.springframework.shell"]; acceptPrefixes: ["", "/", "org.", "org.springframework.", "org.springframework.shell."]
2022-09-26T14:09:52.658-0700	ClassGraph	-- packagePrefixAcceptReject: acceptPrefixes: ["org.springframework.shell."]
2022-09-26T14:09:52.658-0700	ClassGraph	-- pathAcceptReject: accept: ["org/springframework/shell/"]; acceptPrefixes: ["", "/", "org/", "org/springframework/", "org/springframework/shell/"]
2022-09-26T14:09:52.658-0700	ClassGraph	-- pathPrefixAcceptReject: acceptPrefixes: ["org/springframework/shell/"]
2022-09-26T14:09:52.658-0700	ClassGraph	-- classAcceptReject: 
2022-09-26T14:09:52.658-0700	ClassGraph	-- classfilePathAcceptReject: 
2022-09-26T14:09:52.659-0700	ClassGraph	-- classPackageAcceptReject: 
2022-09-26T14:09:52.659-0700	ClassGraph	-- classPackagePathAcceptReject: 
2022-09-26T14:09:52.659-0700	ClassGraph	-- moduleAcceptReject: 
2022-09-26T14:09:52.659-0700	ClassGraph	-- jarAcceptReject: 
2022-09-26T14:09:52.659-0700	ClassGraph	-- classpathElementResourcePathAcceptReject: 
2022-09-26T14:09:52.659-0700	ClassGraph	-- libOrExtJarAcceptReject: 
2022-09-26T14:09:52.660-0700	ClassGraph	-- scanJars: true
2022-09-26T14:09:52.660-0700	ClassGraph	-- scanNestedJars: true
2022-09-26T14:09:52.660-0700	ClassGraph	-- scanDirs: true
2022-09-26T14:09:52.660-0700	ClassGraph	-- scanModules: true
2022-09-26T14:09:52.660-0700	ClassGraph	-- enableClassInfo: true
2022-09-26T14:09:52.660-0700	ClassGraph	-- enableFieldInfo: false
2022-09-26T14:09:52.660-0700	ClassGraph	-- enableMethodInfo: false
2022-09-26T14:09:52.660-0700	ClassGraph	-- enableAnnotationInfo: false
2022-09-26T14:09:52.660-0700	ClassGraph	-- enableStaticFinalFieldConstantInitializerValues: false
2022-09-26T14:09:52.660-0700	ClassGraph	-- enableInterClassDependencies: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- enableExternalClasses: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- enableSystemJarsAndModules: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- ignoreClassVisibility: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- ignoreFieldVisibility: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- ignoreMethodVisibility: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- disableRuntimeInvisibleAnnotations: false
2022-09-26T14:09:52.661-0700	ClassGraph	-- extendScanningUpwardsToExternalClasses: true
2022-09-26T14:09:52.661-0700	ClassGraph	-- allowedURLSchemes: null
2022-09-26T14:09:52.661-0700	ClassGraph	-- addedClassLoaders: null
2022-09-26T14:09:52.661-0700	ClassGraph	-- overrideClassLoaders: null
2022-09-26T14:09:52.661-0700	ClassGraph	-- addedModuleLayers: null
2022-09-26T14:09:52.661-0700	ClassGraph	-- overrideModuleLayers: null
2022-09-26T14:09:52.661-0700	ClassGraph	-- overrideClasspath: [\\192.168.216.1\workspace\gemfire\geode-assembly\build\install\apache-geode\lib\spring-shell-1.2.0.RELEASE.jar]
2022-09-26T14:09:52.661-0700	ClassGraph	-- classpathElementFilters: null
2022-09-26T14:09:52.661-0700	ClassGraph	-- initializeLoadedClasses: false
2022-09-26T14:09:52.662-0700	ClassGraph	-- removeTemporaryFilesAfterScan: false
2022-09-26T14:09:52.662-0700	ClassGraph	-- ignoreParentClassLoaders: true
2022-09-26T14:09:52.662-0700	ClassGraph	-- ignoreParentModuleLayers: false
2022-09-26T14:09:52.662-0700	ClassGraph	-- modulePathInfo: 
2022-09-26T14:09:52.662-0700	ClassGraph	-- maxBufferedJarRAMSize: 67108864
2022-09-26T14:09:52.662-0700	ClassGraph	-- enableMemoryMapping: false
2022-09-26T14:09:52.662-0700	ClassGraph	Number of worker threads: 1
2022-09-26T14:09:52.671-0700	ClassGraph	Finding classpath
2022-09-26T14:09:52.672-0700	ClassGraph	-- Finding classpath and modules
2022-09-26T14:09:52.693-0700	ClassGraph	---- Overriding classpath with: [\\192.168.216.1\workspace\gemfire\geode-assembly\build\install\apache-geode\lib\spring-shell-1.2.0.RELEASE.jar]
2022-09-26T14:09:52.697-0700	ClassGraph	------ Found classpath element: //192.168.216.1/workspace/gemfire/geode-assembly/build/install/apache-geode/lib/spring-shell-1.2.0.RELEASE.jar
2022-09-26T14:09:52.697-0700	ClassGraph	------ WARNING: when the classpath is overridden, there is no guarantee that the classes found by classpath scanning will be the same as the classes loaded by the context classloader
2022-09-26T14:09:52.700-0700	ClassGraph	Opening classpath elements (took 0.107643 sec)
2022-09-26T14:09:52.804-0700	ClassGraph	-- Opening classpath element file://192.168.216.1/workspace/gemfire/geode-assembly/build/install/apache-geode/lib/spring-shell-1.2.0.RELEASE.jar
2022-09-26T14:09:52.805-0700	ClassGraph	---- Opening jar: file://192.168.216.1/workspace/gemfire/geode-assembly/build/install/apache-geode/lib/spring-shell-1.2.0.RELEASE.jar
2022-09-26T14:09:52.807-0700	ClassGraph	------ Could not open jarfile file://192.168.216.1/workspace/gemfire/geode-assembly/build/install/apache-geode/lib/spring-shell-1.2.0.RELEASE.jar : java.io.IOException: Could not get logical zipfile file://192.168.216.1/workspace/gemfire/geode-assembly/build/install/apache-geode/lib/spring-shell-1.2.0.RELEASE.jar : java.io.IOException: Could not get PhysicalZipFile for path /192.168.216.1/workspace/gemfire/geode-assembly/build/install/apache-geode/lib/spring-shell-1.2.0.RELEASE.jar : java.io.FileNotFoundException: File does not exist or cannot be read: C:\192.168.216.1\workspace\gemfire\geode-assembly\build\install\apache-geode\lib\spring-shell-1.2.0.RELEASE.jar
2022-09-26T14:09:52.807-0700	ClassGraph	Finding nested classpath elements
2022-09-26T14:09:52.807-0700	ClassGraph	Final classpath element order:
2022-09-26T14:09:52.808-0700	ClassGraph	Scanning classpath elements (took 0.000397 sec)
2022-09-26T14:09:52.808-0700	ClassGraph	Masking classfiles (took 0.000017 sec)
2022-09-26T14:09:52.810-0700	ClassGraph	Scanning classfiles (took 0.000014 sec)
2022-09-26T14:09:52.810-0700	ClassGraph	Linking related classfiles (took 0.000020 sec)
2022-09-26T14:09:52.814-0700	ClassGraph	Total time: 0.113 sec

As you're probably aware, Java can open UNC-based files. If one passes something like file://192.168.216.1/workspace/somefile to this snippet:

        URI uri = new URI(args[0]);
        Path path = Paths.get(uri);

The path ends up pointing to a WindowsPath object (that looks like \\192.168.216.1\workspace\somefile) and is able to be opened and read.

Thanks for your time!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions