TL; DR :为什么通过IntelliJ启动时一切正常,以及为什么在调用java -jar app.jar
时它会被破坏。我该如何解决这个问题?
好吧,我在后端遇到了一些问题,我试图进行码头化。我在Spring Oauth(2.0.12.RELEASE)guide on their page之后使用Spring Boot(1.4.2.RELEASE)创建了一个应用程序。我遵循Gradle版本,因为我更喜欢Gradle over Maven。我也使用Kotlin而不是Java。一切都很好,我开始通过IntelliJ我的后端与静态前端,我可以通过Facebook(和谷歌和Github)登录,我收到一个很好的Principal
女巫持有我需要的信息,我可以修改Spring Security授权和允许端点。到目前为止一切都很好。
现在对于不好的部分,当我运行./gradlew clean build app:bootrun
或./gradlew clean build app:jar
并通过java -jar
运行jar时(就像我将在我的Docker容器中运行),我的后端出现了。我的静态前端弹出。现在我想通过Facebook登录,我最终登录Facebook登录页面,输入我的凭据,然后...... 没有!
我最终回到我的主页,没有登录,没有任何记录消息对我来说意味着什么,只是沉默。我在日志中看到的最后一件事是:Getting user info from: https://graph.facebook.com/me
此网址会在我的浏览器中显示:
{
"error": {
"message": "An active access token must be used to query information about the current user.",
"type": "OAuthException",
"code": 2500,
"fbtrace_id": "GV/58H5f4fJ"
}
}
当通过IntelliJ启动转到此URL时,它将为我提供凭据详细信息。显然出现了问题,但我不知道是什么。特别是因为IntelliJ的运行工作正常。 jar的启动方式和IntelliJ的运行配置如何工作有一些区别,但我不知道在哪里搜索什么。我可以发布跟踪日志记录,或者我的所有Gradle文件,但也许这太多信息可以放入1个问题。如果有人需要更多细节,我会defenitly更新这个问题:)
该项目的结构大纲如下:
root:
- api: is going to be opensourced later, contains rest definitions and DTOs.
- core: contains the meat. Also here is included in the gradle file
spring-boot-starter, -web, -security, spring-security-oauth2, and some jackson stuff.
- rest: contains versioned rest service implementations.
- app: contains angular webjars amongst others, the front end, and
my `@SpringBootApplication`, `@EnableOAuth2Client`
and the impl of `WebSecurityConfigurerAdapter`.
为什么通过IntelliJ启动时一切运行正常,为什么使用bootRun
或jar artefact来破坏它们。我该如何解决这个问题?
答案 0 :(得分:0)
我发现它,问题不是Multi模块Graldle,Spring启动或Oauth2相关。实际上,这是由于Gradle的src set配置,其中Java应该在Java src set文件夹中,而Kotlin在Java src set文件夹中:
sourceSets {
main.java.srcDirs += 'src/main/java'
main.kotlin.srcDirs += 'src/main/kotlin'
}
正如Will Humphreys在上面的评论中所述,IntelliJ采用所有源集,并运行应用程序。但是,当通过Gradle构建jar时,这些源集更严格。我的Kotlin src集中有一个Java文件,这对IntelliJ来说没问题。但是Gradle创建的jar会考虑build.gralde
文件中定义的更严格的源集。
我在下面的代码中找到了我的遗漏豆问题:
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
System.out.println("Let's inspect the beans provided by Spring Boot:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
};
}
我错过的Bean被称为AuthenticationController
,这是@RestController
,对我的身份验证代码至关重要。