【问题标题】:Finding classes with ClassPath.getTopLevelClasses() in jar packaged by spring-boot-maven-plugin在 spring-boot-maven-plugin 打包的 jar 中查找 ClassPath.getTopLevelClasses() 的类
【发布时间】:2023-03-20 17:27:01
【问题描述】:

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") 找到它们,但无法使用该名称实例化该类。

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

有没有办法让 spring-boot-maven-plugin 在 BOOT-INF 之外将我的类连同它自己的类一起打包?或者有没有其他办法解决这个问题?

【问题讨论】:

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


    【解决方案1】:
    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));
    

    【讨论】:

    • 欢迎来到 StackOverflow,如果需要理解答案,请添加更多描述和代码,因为它会尽快解决其他人的问题。
    猜你喜欢
    • 2019-06-21
    • 2013-01-30
    • 2015-08-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2018-03-18
    相关资源
    最近更新 更多