我正在尝试使用OpenHFT在运行时为 spring data jpa 生成一些存储库,以减少样板代码。问题是,当使用 IDEA 运行时它运行良好,但是如果我在外部 tomcat 或简单地在命令行中运行它:“mvn spring-boot:run”,它无法识别外部资源,例如@Resository
和一些书面类。
我已经努力找到问题但没有用,但是我为这个问题创建了最小的演示:github。我还尝试使用不同的类加载器作为 OpenHFT 编译器的参数,例如 .class、Repository.class 和 Thread.currentThread().getContextClassLoader()。但仍然以错误告终。
@EventListener
private void initRepositoryMapping(ApplicationReadyEvent event) {
unMappedWithRepoEntity.add(Department.class);
unMappedWithRepoEntity.forEach((clazz) -> {
String className = "com.example.repository.DepartmentRepository";
String javaCode =
"\npackage com.example.repository;" +
"\nimport com.example.entity.Department;" +
"\nimport org.springframework.stereotype.Repository;" +
"\nimport java.util.UUID;" +
"\nimport com.example.repository.BaseRepository;" +
"\n@Repository" +
"\npublic interface DepartmentRepository extends BaseRepository<Department, UUID> {}" ;
logger.info("generating java class : {} code:{}", className, javaCode);
try {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
logger.info("using classloader: {}", classLoader);
CompilerUtils.CACHED_COMPILER.loadFromJava(classLoader, className, javaCode);
System.out.println(Class.forName("com.example.repository.DepartmentRepository"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
});
}