Spring Boot + Elastic Beanstalk .ebextensions в JAR

У меня есть очень стандартное приложение Spring Boot (с файлом свойств application.properties, расположенным в стандартной папке /src/main/resources), которое я развертываю на AWS Elastic Beanstalk как «толстый JAR». Работает неплохо, но есть проблема с загрузкой изображений на сервер. После некоторого расследования выяснилось, что конфигурацию NGINX необходимо настроить (увеличить client_max_body_size до чего-то, чтобы он мог принимать загрузки до 10MB), и поэтому я добавил папку .ebextensions в /src/main/resources с файлом со следующим содержимым (взято из этот ответ): -

files:
    "/etc/nginx/conf.d/proxy.conf":
        mode: "000755"
        owner: root
        group: root
        content: |
           client_max_body_size 20M;

Однако когда я запускаю mvn в своей сборке, она не создает .ebextensions в корневой папке, и мне интересно, какое решение для этого лучше всего. Мой pom.xml файл довольно минимален и в настоящее время содержит следующее:

    ...

    <packaging>jar</packaging>

    ....

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>

            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                    <version>1.2.6.RELEASE</version>
                </dependency>
            </dependencies>

        </plugin>

Заранее спасибо!


Обновление 1

@Lorena, когда я вставляю <resources> ... XML в свой pom.xml, а затем запускаю сервер, он вылетает со следующим: -

2017-03-20 21:40:29.504  WARN 10784 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'emailApiSpringBootMail': Unsatisfied dependency expressed through field 'javaMailSender'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2017-03-20 21:40:29.507  INFO 10784 --- [           main] o.apache.catalina.core.StandardService   : Stopping service Tomcat
2017-03-20 21:40:29.533  WARN 10784 --- [           main] o.s.boot.SpringApplication               : Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available)
2017-03-20 21:40:29.637 ERROR 10784 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field javaMailSender in com.myapp.server.api.impl.EmailApiSpringBootMail required a bean of type 'org.springframework.mail.javamail.JavaMailSender' that could not be found.
    - Bean method 'mailSender' not loaded because AnyNestedCondition 0 matched 2 did not; NestedCondition on MailSenderAutoConfiguration.MailSenderCondition.JndiNameProperty @ConditionalOnProperty (spring.mail.jndi-name) did not find property 'jndi-name'; NestedCondition on MailSenderAutoConfiguration.MailSenderCondition.HostProperty @ConditionalOnProperty (spring.mail.host) did not find property 'host'

Повторное удаление XML решает проблему, поэтому, к сожалению, это не сработает.


Обновление 2

Проблемы, описанные в предыдущем разделе, по-видимому, заключались в том, что новый <resources>, указывающий на .ebextentions, переопределял блок <resources>, определенный в:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

Чтобы все заработало, я скопировал его и добавил в конец следующим образом:

    <resources>

        <resource>
            <directory>src/main/resources/ebextensions</directory>
            <targetPath>.ebextensions</targetPath>
            <filtering>true</filtering>
        </resource>

        <!-- Followed is copied from `spring-boot-starter-parent.pom` -->

        <resource>
            <directory>${basedir}/src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/application*.yml</include>
                <include>**/application*.properties</include>
            </includes>
        </resource>
        <resource>
            <directory>${basedir}/src/main/resources</directory>
            <excludes>
                <exclude>**/application*.yml</exclude>
                <exclude>**/application*.properties</exclude>
            </excludes>
        </resource>

    </resources>

Спасибо всем за вашу помощь!


person bobmarksie    schedule 17.03.2017    source источник
comment
Вы пробовали сказать ему в помпе, что он должен переместить папку в корень? Вот так   -  person imTachu    schedule 20.03.2017
comment
Это для развертывания как WAR - я развертываю как толстый JAR, поэтому его легко запускать из командной строки.   -  person bobmarksie    schedule 20.03.2017
comment
Вместо копирования раздела <resources> вы можете использовать подключаемый модуль Build Helper Maven: stackoverflow.com/a/64911750/283136   -  person timomeinen    schedule 19.11.2020


Ответы (5)


Решение, предложенное Лореной Саламанкой Spring Boot + Elastic Beanstalk .ebextensions в JAR у меня не работает ...: \

Мое решение работает с Spring 1.5.3.RELEASE

Добавьте .ebextensions в корень вашего проекта и добавьте этот фрагмент в конце в разделе плагинов:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>prepare</id>
                    <phase>package</phase>
                    <configuration>
                        <tasks>
                            <unzip src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.directory}/${project.build.finalName}" />
                            <copy todir="${project.build.directory}/${project.build.finalName}/" overwrite="false">
                                <fileset dir="./" includes=".ebextensions/**"/>
                            </copy>
                            <!-- <jar jarfile="${project.build.directory}/${project.build.finalName}.jar" basedir="${project.build.directory}/${project.build.finalName}"/>-->
                            <zip compress="false" destfile="${project.build.directory}/${project.build.finalName}.jar" basedir="${project.build.directory}/${project.build.finalName}"/>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Этот плагин использует ant для распаковки последнего jar-файла, созданного при загрузке Spring, копирования .ebextensions в корень и zip (jar) снова с тем же именем. Протестировано и работает в продакшене :)

person Javier Arnáiz    schedule 23.06.2017
comment
Вы проверяли это и на более старых версиях? - person bobmarksie; 29.06.2017
comment
Это сработало для меня. Другое решение кажется немного менее взломанным, но я не могу заставить его работать. Спасибо за код @Javier Arnáiz - person ; 04.10.2017
comment
Говорил слишком быстро. Это дает мне [Tomcat-startStop-1] ОШИБКУ on.apache.catalina.core.ContainerBase - сбой дочернего контейнера во время запуска :( - person ; 04.10.2017
comment
Я тестировал это в версии выпуска Spring boot 2.0.0, и он работает. Также упомянутое вами решение также не сработало для меня, поскольку оно не копирует папку .elasticbeanstalk в корне файла jar. - person Jimmy; 10.07.2018
comment
Также подтверждено, что этот метод работает с Spring Boot 2.1.2, maven 3.6 и текущим AWS Elastic Beanstalk (февраль 2019 г.). - person Bampfer; 21.02.2019
comment
@Bampfer Я пробую это решение, но при развертывании у меня возникает ошибка nginx: nginx: [emerg] unknown directive files: в /var/elasticbeanstalk/staging/nginx/conf.d/proxy.conf:7 . Я делаю что-то неправильно? - person drenda; 15.06.2019
comment
@drenda Предполагается, что директива files отправляется в Beanstalk, сообщая ему создать файл с именем proxy.conf с директивой client_max_body_size в нем. Из вашей ошибки похоже, что команда files: вместо этого оказалась внутри файла proxy.conf. Я предполагаю, что вы поместите команду 'files' в папку .ebextensions/nginx/conf.d, а не .ebextensions. (См. Лучший ответ на stackoverflow.com/questions/18908426/ - любой метод может работать, но не смешивайте их.) Надеюсь, что это поможет - person Bampfer; 17.06.2019
comment
@Bampfer Большое спасибо! Я наконец-то решил эту проблему, которая давно меня раздражала! - person drenda; 17.06.2019

Вот фрагмент pom, который заставит его работать для JAR:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources/ebextensions</directory>
            <targetPath>.ebextensions</targetPath>
            <filtering>true</filtering>
        </resource>
        <!-- Followed is copied from `spring-boot-starter-parent.pom` -->
        <resource>
            <directory>${basedir}/src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/application*.yml</include>
                <include>**/application*.properties</include>
            </includes>
        </resource>
        <resource>
            <directory>${basedir}/src/main/resources</directory>
            <excludes>
                <exclude>**/application*.yml</exclude>
                <exclude>**/application*.properties</exclude>
            </excludes>
        </resource>
    </resources>
</build>

Он работает так же, как перемещение расширений .ebextensions в корневой каталог в файле .war.

На самом деле я загрузил образец в это репо. Просто сделай mvn package

person imTachu    schedule 20.03.2017
comment
Спасибо, Лорена, за ответ. Однако, когда я добавил это, сервер не запускался - вопрос обновлен. - person bobmarksie; 21.03.2017
comment
Хорошо, похоже, он также фильтрует ваши свойства. Этот подход, который я вам показываю, представляет собой решение, которое вам может потребоваться приспособить к вашей конкретной ситуации. (поскольку у меня нет всего контекста вашего приложения), пожалуйста, сделайте, как указано здесь и дайте мне знать. - person imTachu; 21.03.2017
comment
Как упоминалось выше, это стандартное приложение для весенней загрузки с application.properties в /src/main/resources folder - person bobmarksie; 23.03.2017
comment
Добавление <resource><directory>src/main/resources</directory><filtering>true</filtering></resource> к вашему решению устранило мою проблему. - person bobmarksie; 26.03.2017
comment
Спасибо за этот ответ, однако мне интересно, почему для этого требуются 2-й и 3-й resource дочерние элементы? Мне кажется, что их исключение дает тот же результат. Я что-то упускаю? - person oschlueter; 05.05.2017
comment
Для меня это работает с spring-boot-starter-parent в версии 1.3.0.RELEASE, но не с 1.4.6.RELEASE - person johanvs; 20.05.2017
comment
@johanvas - это интересно - вы заставили это работать? - person bobmarksie; 21.06.2017
comment
Я пробовал с Spring Boot 2.0.3, и, похоже, не работает. Какой-то намек? Не могли бы вы показать, как выглядит структура финального .jar? Спасибо - person drenda; 12.11.2018
comment
это перемещает папку .ebextension в корень исходного jar-файла, а не uber-jar, созданный плагином, верно? - person Balázs Németh; 03.10.2019

Я считаю, что в этом случае используется автономный JAR, проще использовать Конфигурация на основе Procfile, а затем свяжите JAR и .ebextensions в zip-файл.

Сначала создайте файл с именем Procfile в корне проекта со следующим содержимым:

web: java -jar sample_app-1.0.0.jar

Затем создайте zip-файл, содержащий JAR, Procfile файл и .ebextensions каталог:

sample_app.zip
|
|_.ebextensions
|   |_ nginx
|      |_ conf.d
|         |_ proxy.conf
|
|_ sample_app-1.0.0.jar
|_ Procfile
person Khashayar    schedule 23.05.2018
comment
Что должно быть в файле proxy.conf? - person Saurabh Padwekar; 21.12.2020
comment
@SaurabhPadwekar Конфиги nginx, которые вы хотите перезаписать. Например, что-то вроде client_max_body_size 150M; увеличит максимальное значение тела клиента по умолчанию. - person Khashayar; 21.12.2020
comment
Спасибо. Я последовал твоему предложению, и это сработало. - person Saurabh Padwekar; 21.12.2020

Сообщение об ошибке, которое вы получаете, связано с тем, что свойство javaMailSender не найдено.

Путь к ресурсам, указанный в вашем pom.xml, переопределяет корневой путь ресурсов по умолчанию.

Следовательно, JavaMailSender ищет конфигурацию jndi или свойства почты в этом новом пути к ресурсам и не может их найти. Отсюда и ошибка.

spring.mail.jndi-name=mail/testmail

OR

spring.mail.host=testserver.com
spring.mail.port=25
spring.mail.username=test
spring.mail.password=test123
spring.mail.protocol=smtp
spring.mail.defaultEncoding=UTF-8
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.auth.mechanisms=NTLM
spring.mail.properties.mail.smtp.auth.ntlm.domain=DOMAIN
spring.mail.properties.mail.debug=true
person Tiny    schedule 21.03.2017
comment
У меня есть все эти свойства в моем application.properties, и все работает по электронной почте, пока я не добавлю тег <resources>. - person bobmarksie; 21.03.2017
comment
да. но, по моему мнению, javamailsender ищет ту же конфигурацию в новом пути к ресурсам, добавленном вами в pom.xml .. Можете ли вы указать путь к ресурсам по умолчанию в pom.xml и проверить, сохраняется ли проблема .. - person Tiny; 21.03.2017
comment
Это очень стандартное приложение для весенней загрузки с application.properties в папке /src/main/resources. - person bobmarksie; 22.03.2017

На самом деле это проблема с пружинной загрузкой. Поскольку вы используете версию Spring-boot 1.2.6, в которой есть некоторые ошибки, такие как проблема с javamailsender. Вам необходимо обновить версию весенней загрузки до версии выше 1.3.0.release.

В этом тикете № 3478 проблема почтового отправителя исправлена ​​в весенний период. ботинок. Таким образом, вы можете обновиться до последней версии или более поздней версии, чем версия 1.3.0.

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>1.3.5.RELEASE</version>
</dependency>

Надеюсь, это решит вашу проблему.

person SkyWalker    schedule 25.03.2017