簡體   English   中英

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

[英]Finding classes with ClassPath.getTopLevelClasses() in jar packaged by spring-boot-maven-plugin

spring-boot-maven-plugin 將所有“我的”類和 3rd 方庫打包在 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 打包到我的類中? 或者有沒有其他方法可以解決這個問題?

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM