在spring-boot-maven-plugin打包的jar中使用ClassPath.getTopLevelClasses()查找类

时间:2019-05-20 10:53:57

标签: java classpath spring-boot-maven-plugin

spring-boot-maven-plugin将所有“我的”类和第三方库打包在BOOT-INF / classes.com.my.package.MyClass.class

这使得无法正常使用ClassPath.getTopLevelClasses("com.my.package")找到它们。

我可以用ClassPath.getTopLevelClasses("BOOT-INF.classes.com.my.package")找到它们,但是无法使用该名称实例化该类。

不幸的是,此程序包扫描发生在库中,而不是在我的代码中,因此我无法更改它。我唯一能做的就是配置在哪里搜索我的课程。

在BOOT-INF之外,有什么办法可以将我的类的spring-boot-maven-plugin包和它的类一起拥有?还是有其他解决方法?

1 个答案:

答案 0 :(得分:0)

private final static String TARGET_PACKAGE = "com.my.package";
private final String SPRING_BOOT_PREFIX = "BOOT-INF.classes.";

private Set<ClassInfo> getClassInfoSet() {
    try {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Set<ClassInfo> classInfoSet = ClassPath.from(loader).getTopLevelClasses(TARGET_PACKAGE);
        if (classInfoSet.isEmpty()) {
            classInfoSet = ClassPath.from(loader).getTopLevelClasses(SPRING_BOOT_PREFIX + TARGET_PACKAGE);
        }
        return classInfoSet;
    }
    catch (IOException e) {
        return Collections.emptySet();
    }
}

private String getClassName(ClassInfo classInfo) {
    String className = classInfo.getName();
    if (className.contains(SPRING_BOOT_PREFIX)) {
        return StringUtils.substringAfterLast(className, SPRING_BOOT_PREFIX);
    }
    return className;
}

// you can get the Class now
Class.forName(getClassName(classInfo));