IntelliJ运行与运行jar,使用Spring Oauuth2进行Springboot Kotlin,Multi模块Gradle项目

时间:2016-12-15 23:51:58

标签: intellij-idea gradle spring-boot oauth-2.0 spring-security-oauth2

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来破坏它们。我该如何解决这个问题?

1 个答案:

答案 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,对我的身份验证代码至关重要。