Java 在spring boot maven插件打包的jar中查找ClassPath.GetToLevel classes()的类
SpringBootMaven插件将所有“我的”类和第三方库打包在boot-INF/classes.com.my.package.MyClass.class下 这使得使用正常工作的Java 在spring boot maven插件打包的jar中查找ClassPath.GetToLevel classes()的类,java,classpath,spring-boot-maven-plugin,Java,Classpath,Spring Boot Maven Plugin,SpringBootMaven插件将所有“我的”类和第三方库打包在boot-INF/classes.com.my.package.MyClass.class下 这使得使用正常工作的ClassPath.getTopLevelClasses(“com.my.package”)无法找到它们 我可以通过ClassPath.getTopLevelClasses(“BOOT-INF.classes.com.my.package”)找到它们,但该类不能用该名称实例化 不幸的是,这个包扫描发生在一个库中,而不是
ClassPath.getTopLevelClasses(“com.my.package”)
无法找到它们
我可以通过ClassPath.getTopLevelClasses(“BOOT-INF.classes.com.my.package”)
找到它们,但该类不能用该名称实例化
不幸的是,这个包扫描发生在一个库中,而不是在我的代码中,所以我无法更改它。我唯一能做的就是配置在哪里搜索我的类
有没有办法让SpringBootMaven插件在boot-INF之外将我的类和它自己的类一起打包?或者还有其他方法吗?私有最终静态字符串TARGET\u PACKAGE=“com.my.PACKAGE”;
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));
私有最终字符串SPRING\u BOOT\u PREFIX=“BOOT-INF.classes。”;
私有集getClassInfo集(){
试一试{
ClassLoader=Thread.currentThread().getContextClassLoader();
Set classinfo Set=ClassPath.from(loader).getToLevel类(TARGET\u包);
if(classinfo集.isEmpty()){
classInfoSet=ClassPath.from(loader).getToLevel类(SPRING\u BOOT\u前缀+TARGET\u包);
}
返回classinfo集;
}
捕获(IOE异常){
返回集合;
}
}
私有字符串getClassName(ClassInfo ClassInfo){
字符串className=classInfo.getName();
if(className.contains(SPRING\u BOOT\u前缀)){
返回StringUtils.substringAfterLast(类名,SPRING\u BOOT\u前缀);
}
返回类名;
}
//你现在可以上课了
forName(getClassName(classInfo));
私有最终静态字符串TARGET\u PACKAGE=“com.my.PACKAGE”;
私有最终字符串SPRING\u BOOT\u PREFIX=“BOOT-INF.classes。”;
私有集getClassInfo集(){
试一试{
ClassLoader=Thread.currentThread().getContextClassLoader();
Set classinfo Set=ClassPath.from(loader).getToLevel类(TARGET\u包);
if(classinfo集.isEmpty()){
classInfoSet=ClassPath.from(loader).getToLevel类(SPRING\u BOOT\u前缀+TARGET\u包);
}
返回classinfo集;
}
捕获(IOE异常){
返回集合;
}
}
私有字符串getClassName(ClassInfo ClassInfo){
字符串className=classInfo.getName();
if(className.contains(SPRING\u BOOT\u前缀)){
返回StringUtils.substringAfterLast(类名,SPRING\u BOOT\u前缀);
}
返回类名;
}
//你现在可以上课了
forName(getClassName(classInfo));
欢迎使用StackOverflow,如果需要了解答案,请添加更多说明和代码,因为这将尽快解决其他人的问题。欢迎使用StackOverflow,如果需要了解答案,请添加更多说明和代码,因为这将尽快解决其他人的问题。