无法 运行 从 spring-boot jersey 生成 jar
Unable to run generated jar from spring-boot jersey
我无法 运行 使用我的 spring-boot with jersey 项目生成 jar 文件。
我遇到的例外是:
Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1
通过 IDE(运行 主程序 class)或使用 spring-boot 完成时 运行s 正确投射:运行
以下是当前设置的详细信息:
包装:
jar
依赖性:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
我的球衣配置 (ResourceConfig) 设置为扫描包
@Component
public class JerseyConfiguration extends ResourceConfig {
public JerseyConfiguration() {
packages(true, "com.my.base.jaxrs.packages");
}
}
spring-boot-maven-plugin 配置为:
org.springframework.boot
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
我也没有使用 spring-boot-starter-parent,但添加了 spring-boot-dependencies,如文档中所示。
这更像是一种解决方法,而不是实际使用的有效解决方案
包(真,"my.package");
参考 Anton 的回答,我解决了这个解决方案,但它需要具有 class 级别 @Path 或 @Provider 注释的资源的限制:
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AnnotationTypeFilter(Path.class));
provider.addIncludeFilter(new AnnotationTypeFilter(Provider.class));
provider.findCandidateComponents("my.package.here").forEach(beanDefinition -> {
try {
LOGGER.info("registering {} to jersey config", beanDefinition.getBeanClassName());
register(Class.forName(beanDefinition.getBeanClassName()));
} catch (ClassNotFoundException e) {
LOGGER.warn("Failed to register: {}", beanDefinition.getBeanClassName());
}
});
我遇到了这个问题,我不想让事情太复杂,所以我只是单独注册了我所有的球衣控制器。
@Configuration
public class JerseyConfig extends ResourceConfig {
JerseyConfig() {
// my old version that does not play well with spring boot fat jar
/*
packages(
"com.mycompany.api.resources"
);
*/
register(com.mycompany.api.resources.FooController.class);
register(com.mycompany.api.resources.BarController.class);
}
注意:我不建议将它用于包含许多文件的大型项目,它很快就会变得冗长且难以阅读且维护起来很乏味。
也就是说,这是一个可行的解决方案,您将能够使用通常的 java -jar my-project.jar
命令 运行 您的 jar。
或者你可以这样做,
@Configuration
public class JerseyConfig extends ResourceConfig {
JerseyConfig() {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setResourcePackage("com.mycompany.api.resources");
}
}
我无法 运行 使用我的 spring-boot with jersey 项目生成 jar 文件。
我遇到的例外是:
Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1
通过 IDE(运行 主程序 class)或使用 spring-boot 完成时 运行s 正确投射:运行
以下是当前设置的详细信息:
包装:
jar
依赖性:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
我的球衣配置 (ResourceConfig) 设置为扫描包
@Component
public class JerseyConfiguration extends ResourceConfig {
public JerseyConfiguration() {
packages(true, "com.my.base.jaxrs.packages");
}
}
spring-boot-maven-plugin 配置为: org.springframework.boot
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
我也没有使用 spring-boot-starter-parent,但添加了 spring-boot-dependencies,如文档中所示。
这更像是一种解决方法,而不是实际使用的有效解决方案 包(真,"my.package");
参考 Anton 的回答,我解决了这个解决方案,但它需要具有 class 级别 @Path 或 @Provider 注释的资源的限制:
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AnnotationTypeFilter(Path.class));
provider.addIncludeFilter(new AnnotationTypeFilter(Provider.class));
provider.findCandidateComponents("my.package.here").forEach(beanDefinition -> {
try {
LOGGER.info("registering {} to jersey config", beanDefinition.getBeanClassName());
register(Class.forName(beanDefinition.getBeanClassName()));
} catch (ClassNotFoundException e) {
LOGGER.warn("Failed to register: {}", beanDefinition.getBeanClassName());
}
});
我遇到了这个问题,我不想让事情太复杂,所以我只是单独注册了我所有的球衣控制器。
@Configuration
public class JerseyConfig extends ResourceConfig {
JerseyConfig() {
// my old version that does not play well with spring boot fat jar
/*
packages(
"com.mycompany.api.resources"
);
*/
register(com.mycompany.api.resources.FooController.class);
register(com.mycompany.api.resources.BarController.class);
}
注意:我不建议将它用于包含许多文件的大型项目,它很快就会变得冗长且难以阅读且维护起来很乏味。
也就是说,这是一个可行的解决方案,您将能够使用通常的 java -jar my-project.jar
命令 运行 您的 jar。
或者你可以这样做,
@Configuration
public class JerseyConfig extends ResourceConfig {
JerseyConfig() {
BeanConfig beanConfig = new BeanConfig();
beanConfig.setResourcePackage("com.mycompany.api.resources");
}
}