0

TL; DR: Почему все прекрасно работать при запуске с помощью IntelliJ, и почему она нарушается, когда вызов java -jar app.jar. И как мне это исправить?IntelliJ бежать против запуска баночку, с Springboot Котлин, Мульти модуль Gradle проекта с социальной oauth2


Хорошо, у меня есть некоторые проблемы с бэкэнд, которые я пытаюсь выполнить докерезом. У меня есть приложение, созданное с помощью Spring Boot (1.4.2.RELEASE) после Spring Oauth (2.0.12.RELEASE) guide on their page. Я следую версии Gradle, так как предпочитаю Gradle над Maven. Также я использую Kotlin вместо Java. Все в порядке, я начинаю с IntelliJ my backend со статическим интерфейсом, я могу войти в систему через Facebook (и Google и Github), я получаю хороший Principal, ведьма держит всю необходимую мне информацию, и я могу изменить Spring Security для авторизации и разрешения конечные точки. Все идет нормально.

Теперь плохая часть, когда я бегу либо ./gradlew clean build app:bootrun или ./gradlew clean build app:jar и запустить банку через java -jar (как я буду делать в контейнере Докер), мой бэкенд приходит. Мой статический передний конец всплывает. Теперь я хочу войти через Facebook, я нахожусь на странице входа в Facebook, я ввожу свои учетные данные и ... ничего!
Я в конечном итоге вернусь на свою домашнюю страницу, не вошел в систему, никаких сообщений журнала, которые ничего для меня означают, просто тишина. Последнее, что я вижу в журнале является:
Getting user info from: https://graph.facebook.com/me

Этот URL даст мне в моем браузере:

{ 
    "error": { 
     "message": "An active access token must be used to query information about the current user.", 
     "type": "OAuthException", 
     "code": 2500, 
     "fbtrace_id": "GV/58H5f4fJ" 
    } 
} 

При переходе к этому URL через начало IntelliJ, это даст мне верительные данные. Очевидно, что-то идет не так, но я понятия не имею. Тем более, что работа от IntelliJ работает нормально. Существует некоторая разница между тем, как запускается jar и как работает конфигурация IntelliJ, но я не знаю, где искать что. Я могу опубликовать журнал трассировки или все мои файлы Gradle, но, возможно, это слишком много информации, чтобы задать один вопрос. Я буду 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 или артефакт в банке. И как мне это исправить?

+1

Когда вы запускаете Java-приложение в IntelliJ, он печатает команду, которую он использует для запуска приложения в качестве первой строки в окне «Выполнить». Трудно видеть, поскольку он всегда рушится. Это не совсем то же самое, что вы пытаетесь запустить банку, и IntelliJ будет просто использовать папки src, но вы, по крайней мере, сможете ее скопировать и сравнить с другими подходами. –

ответ

0

Я нашел его, проблема была не в модуле Graldle, Spring Boot, а в Oauth2. На самом деле это было связано с ЦСИ заданной конфигурации из Gradle, где Java должен был быть в комплекте папку Java Src и Котлин в Java набора ЦСИ папку:

sourceSets { 
    main.java.srcDirs += 'src/main/java' 
    main.kotlin.srcDirs += 'src/main/kotlin' 
} 

Как заявил Уилл Хамфрис в своем комментарии выше , IntelliJ берет все исходные наборы и запускает приложение. Однако при создании банки через Gradle эти наборы источников более строгие. У меня был Java-файл в моем наборе Kotlin src, что не проблема для IntelliJ. Но jar, созданный Gradle, учитывает исходные наборы, определенные в файле 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); 
     } 

    }; 
} 

Бин я пропустил был назван AuthenticationController, который является @RestController, и своего рода решающее значение для моего кода аутентификации.