我有一个托管 REST API 的 Spring Boot 应用程序。
根据部署的文件,我希望能够从本质上是“插件”JAR 文件加载其他 Controller 。
例如,我希望能够做这样的事情:
java -jar myapp.jar -Dplugins.directory=/opt/myapp/plugins
这可能吗?
注意:这些不会即时加载;一旦部署,插件集将保持固定。我希望有一个应用程序 jar 在每次部署中都保持不变,并且应用程序的行为将由与其一起部署的插件决定。
最佳答案
它可能不能100%满足您的需求。 我有两个建议。
简单的一个。
java -jar stackoverflow-1.0-SNAPSHOT.jar --spring.profiles.active=prod
并在您的 Controller 上放置不同的值“@Profile”。
@RestController
@Profile("prod")
public class URLOneController {
@PostMapping(value = "/url", consumes="application/json", produces="application/json")
public ResponseEntity<HttpStatus> insertClaim(@RequestBody String messageBody) {
return new ResponseEntity<>(HttpStatus.OK);
}
}
<小时/>
第二个建议,动态加载beanDefiniton。
@Configuration
@ConditionalOnProperty(name="external.controller.enable",havingValue = "true")
public class ExternalClassDefinitionProcessor implements
BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Class<?> aClass = null;
try {
aClass = contextClassLoader.loadClass("com.jin.learn.demo.UrlOneController");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
.genericBeanDefinition(aClass);
beanDefinitionBuilder.addPropertyReference("personDao", "personDao");
BeanDefinition personManagerBeanDefinition = beanDefinitionBuilder
.getRawBeanDefinition();
registry.registerBeanDefinition("UrlOneController",
personManagerBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory
beanFactory) throws BeansException {
}
}
将 Controller 打包到普通 jar 中(不使用 spring-boot-maven-plugin )
像这样的命令行运行你的应用程序
java -Dloader.path="lib/,config/,/home/jin/Desktop/abc/target/abc-1.0-SNAPSHOT.jar" -jar stackoverflow-1.0-SNAPSHOT.jar --external.controller.enable=true
abc-1.0-SNAPSHOT.jar 中的额外 Controller 和您的主应用程序是 stackoverflow-1.0-SNAPSHOT.jar
提示: stackoverflow-1.0-SNAPSHOT.jar 应打包为 zip 格式。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
</configuration>
</plugin>
关于java - 如何动态加载Spring Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262808/