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

问题描述 投票:0回答:1

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

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

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

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

在BOOT-INF之外,有什么方法可以让我的类以及自己的类使用spring-boot-maven-plugin软件包?还是有其他解决方法?

java classpath spring-boot-maven-plugin
1个回答
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));
© www.soinside.com 2019 - 2024. All rights reserved.