(Зависимость) Spring шаблоны MVC не найдены для jar-файла spring -boot embedded-tomcat в родительском проекте (gradle)?

У меня есть небольшое приложение для весенней загрузки, которое управляет пользователями.
Я хочу включить это приложение UserManagement в качестве зависимости (градиента) в другие мои приложения с весенней загрузкой.

Я не хочу запускать приложение UserManagement как отдельное приложение (оно должно делиться bean-компонентами с родительским приложением).

Я использую gradle и плагин spring -boot. Я включил банку UserManagement в качестве зависимости в Spring-boot ExampleApp.

Приложение UserManagement запускает сервер встроенного tomcat на порту 8081.
ExampleApp запускает сервер встроенного tomcat на порту 8080.

Все работает хорошо, за исключением моего пользовательского интерфейса UserManagement MVC.
Когда я открываю приложение User-Management на порту 8081, мои шаблоны MVC не обнаруживаются.

Кажется, я не могу найти шаблоны MVC для приложения UserManagement в родительском приложении ExampleApp.
Возможно ли это с пружинным ботинком?


person mckenzie    schedule 17.03.2018    source источник


Ответы (1)


да. Ты можешь сделать это. Я не уверен, как вы делитесь бобами, но полагаю, вы тоже можете это сделать.

SpringApplicationBuilder
Поскольку приложение «UserManagement» является зависимостью, я предполагаю, что вы вызываете метод для его запуска из родительского приложения

Например, вы, вероятно, что-то делаете нравится:

public class UserManagementApplication {
    private static UserManagementApplication instance = null;

    private final SpringApplicationBuilder springApplicationBuilder;
    private ConfigurableApplicationContext context;

    private UserManagementApplication() {
       this.springApplicationBuilder = new SpringApplicationBuilder(UserManagementApplication.class);
    }

    public static void start() {
        synchronized (UserManagementApplication.class) {
            if (instance == null) {
                /*
                 ******** If singleton instance is null ***************************************
                 ******** Create a new UserManagementApplication ******************************
                 */
                instance = new UserManagementApplication();
            }

            if (instance.context == null
                    || !instance.context.isActive()) {
                /*
                 ******** If the context is null or not active ********************************
                 ******** Create new SpringApplication and run it  ****************************
                 ******** Store the resulting ConfigurableApplicationContext in memory ********
                 */
                instance.context = instance.springApplicationBuilder.run(new String[]{});
            }
        }
    }

    public static void stop() {
        synchronized (UserManagementApplication.class) {
            if (instance == null
                    || instance.context == null
                    || !instance.context.isActive()) return;
            /*
             ******** If the context is active ********************************************
             ******** Close the context  **************************************************
             ******** Set context back to null ********************************************
             */

            instance.context.close();
            instance.context = null;
        }
    }

    public static ConfigurableApplicationContext getContext() {
        if (instance == null) return null;
        return instance.context;
    }
}

UserManagement gradle.build и местоположения

  1. Поскольку вам не нужно запускать приложение «UserManagement» как исполняемый файл jar, вы можете отказаться от плагина spring -boot и создать свой собственный jar.
  2. Since your are using tomcat you can put templates and static resources in META and templates in WEB-INF.
    • Resources => src/main/resources/META-INF/resources/static/
    • Шаблоны => src / main / resources / WEB-INF / templates /

Например, ваша сборка gradle может выглядеть примерно так:

buildscript {
    ext {
        springBootVersion = '2.0.0.M7'
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
        maven { url 'http://repo.spring.io/plugins-release' }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath 'io.spring.gradle:propdeps-plugin:0.0.9.RELEASE'
        classpath 'org.springframework:springloaded:1.2.6.RELEASE'
    }
}

ext {
    springBootVersion = '2.0.0.M7'
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'groovy'
// apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'propdeps'
apply plugin: 'propdeps-idea'

group = 'com.example.userManagement'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}

configurations {
    includeInJar
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-groovy-templates')
    compile('org.codehaus.groovy:groovy')

    includeInJar("org.webjars:bootstrap:4.0.0")
    includeInJar("org.webjars:jquery:3.3.1")
    configurations.compile.extendsFrom(configurations.includeInJar)
}

idea {
    module {
        inheritOutputDirs = true
    }
}

jar {
    from configurations.includeInJar.collect { it.isDirectory() ? it : zipTree(it) }
}

compileJava.dependsOn(processResources)

Конфигурация MVC

Также убедитесь, что ваша конфигурация MVC знает, где находятся ресурсы.
Например, если вы расширяете WebMvcConfigurerAdapter:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/static/**").addResourceLocations("classpath:META-INF/resources/static/");
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:META-INF/resources/webjars/");
    registry.addResourceHandler("/**").addResourceLocations("classpath:META-INF/");
}

Шаблоны MVC

Если у вас есть файл my-bundle.min.js в src / main / resources / META-INF / resources / static / js, вы можете его найти из вашего шаблона mvc следующим образом:

<script src="/resources/static/js/my-bundle.min.js"></script>



Надеюсь, это поможет!

person thesb    schedule 17.03.2018
comment
Довольно близко к тому, что я делаю. Я могу совместно использовать beans между двумя приложениями, просто передав ApplicationContext ExampleApp в класс, который я использую для запуска приложения UserManagement. Мне нравится ваш одноэлементный класс, может быть, я могу просто добавить частный parentApplicationContext к одноэлементному классу и установить его в методе start ()? Я попробую. Спасибо! - person mckenzie; 18.03.2018