Измените имя монго dbname через скрипт сборки - PullRequest
0 голосов
/ 24 апреля 2019

Что мне нужно:
Я хочу настроить конвейер автоматического развертывания - у меня следующий план:
Я создаю два .war файла, назовем их prod.war и test.war, используясценарий сборки Gradle и разверните их на моем сервере Tomcat.

Моя проблема:
prod.war требуется доступ к производственной базе данных (mongoprod) и test.war к тестовой базе данных (mongotest).

Myпопытка:
Я думал, что могу использовать профили Spring и просто ...

  1. ... изменить строку в моем application-context.xml с:
    <mongo:db-factory id="mongoDbFactory" dbname="mongoprod"/>
    на:
    <mongo:db-factory id="mongoDbFactory" dbname="${mongo.db.name}"/>
  2. ... создать два файла в одной папке (<filename>: <content>):
    application-production.properties: mongo.db.name=mongotest
    application-test.properties: mongo.db.name=mongoprod
  3. ... выполнить некоторый скрипт сборки gradle с аргументом, который может изменить профиль на production или test, а затем использовать соответствующий файл .property, чтобы вставить желаемое имя dongname монго...но вот где мне не повезло!
    Я пытался добавить это в мой build.gradle файл:
    bootRun { args = ["--spring.profiles.active=" + profiles] }
    , а затем запустить его с $ ./gradlew bootRun -Ptest
    , но я просто получаюошибка:
    Main class name has not been configured and it could not be resolved
    и, кроме того, я не использовал bootRun раньше, только задачу war для создания моих .war файлов:
    war { archiveName = 'application.war' dependsOn 'lessc', 'webpack' from "$buildDir/webapp" exclude 'WEB-INF/js/main.js' rename 'main\\.min\\.js', 'main.js' }

Кто-нибудь знает, как я могу заставить мою проблему работать, или может дать мне полезнуюинформация об этом?

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Необходимо указать имя основного класса, которое будет запускаться задачей bootRun, например, следующим образом:

springBoot {
    mainClassName = 'org.baeldung.DemoApplication'
}

Подробнее об этом можно прочитать в этом учебном пособии

Обновление:

Конфигурация для плагина приложения может быть выполнена следующим образом

application {
    mainClassName = 'org.gradle.sample.Main'
}

Как сказано в документации по плагина

0 голосов
/ 30 апреля 2019

Я обнаружил, что для моего случая оказалось гораздо проще (и я думаю, лучше) принять решение во время выполнения, следует ли использовать тестовую или производственную базу данных, и я решил это следующим образом:
В моем application-context.xml я создал два bean-компонента вместо одного, по одному для каждой БД (я должен был поместить их ниже «корневых» bean-компонентов, иначе я получил ошибки при сборке):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.5.xsd">

    <beans profile="prod">
        <mongo:db-factory id="mongoDbFactory" dbname="mongoprod"/>

        <mongo:mapping-converter id="mongoConverter" base-package="my.company.project">
            <mongo:custom-converters base-package="my.company.project"/>
        </mongo:mapping-converter>

        <mongo:gridFsTemplate bucket="images" converter-ref="mongoConverter" db-factory-ref="mongoDbFactory"/>
    </beans>

    <beans profile="test">
        <mongo:db-factory id="mongoDbFactory" dbname="mongotest"/>

        <mongo:mapping-converter id="mongoConverter" base-package="my.company.project">
            <mongo:custom-converters base-package="my.company.project"/>
        </mongo:mapping-converter>

        <mongo:gridFsTemplate bucket="images" converter-ref="mongoConverter" db-factory-ref="mongoDbFactory"/>
    </beans>

</beans>

Чтобы создание файла .war работало правильно, мне пришлось установить enabled на true в моем файле build.gradle здесь:

war {
    enabled = true //without this no .war file was created before - https://stackoverflow.com/a/52315049/4120196
    dependsOn 'lessc', 'webpack'
    from "$buildDir/webapp"
    exclude 'WEB-INF/js/main.js'
    rename 'main\\.min\\.js', 'main.js'
}

Затем я создал файл .war, скопировал его и переименовал - так у меня было два: prod.war и test.war и поместил их в мою папку Tomcat 8.5_Tomcat8.5.23\webapps (я работаю на Win10, если он отличается другие системы). Затем я создал два XML-файла с тем же именем, что и .war-файлы, в которых я определил весенний профиль, который решает, какой бин принимать в Tomcat 8.5_Tomcat8.5.23\conf\Catalina\localhost:
prod.xml

<Context>
  <Environment name="spring.profiles.active" value="prod" type="java.lang.String" override="false" />
</Context>

test.xml

<Context>
  <Environment name="spring.profiles.active" value="test" type="java.lang.String" override="false" />
</Context>  

Я запустил Tomcat и, наконец, все заработало, как я хотел.

Если у вас есть какие-либо советы, как моё решение может быть улучшено, не стесняйтесь комментировать:)
Я чувствую, что мое application-context.xml может быть как-то сокращено, например ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...