【问题标题】:Spring Boot + Elastic Beanstalk .ebextensions in JARJAR 中的 Spring Boot + Elastic Beanstalk .ebextensions
【发布时间】:2017-08-09 05:59:14
【问题描述】:

我有一个非常标准的 Spring Boot 应用程序(带有一个位于标准 /src/main/resources 文件夹中的 application.properties 属性文件),我将其作为“胖 JAR”部署在 AWS Elastic Beanstalk 上。它工作得很好,但是在服务器上上传图像存在问题。经过一番调查,似乎需要调整 NGINX 配置(将client_max_body_size 增加到某个值,以便它可以接受高达10MB 的上传),因此我在/src/main/resources 下添加了一个.ebextensions 文件夹,其中包含一个文件以下内容(取自this answer):-

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 当我将&lt;resources&gt; ... 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

上一节中描述的问题似乎是指向.ebextentions 的新&lt;resources&gt; 覆盖了以下定义的&lt;resources&gt; 块:-

<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>

感谢大家的帮助!

【问题讨论】:

  • 您是否尝试在 pom 中告诉它应该将文件夹移动到根目录? Like this
  • 那是作为 WAR 部署的 - 我正在部署为胖 JAR,因此很容易从命令行运行。
  • 您可以使用 Build Helper Maven 插件,而不是复制 &lt;resources&gt; 部分:stackoverflow.com/a/64911750/283136

标签: spring-boot amazon-elastic-beanstalk spring-boot-maven-plugin


【解决方案1】:

这是一个 pom sn-p,它可以使它适用于 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>

它的工作方式与moving .ebextensions to root in .war file 相同

其实我把样本上传到了repo。只需做一个mvn package

【讨论】:

  • 感谢 Lorena 的回答。但是,当我添加它时,服务器不会启动 - 问题已更新。
  • 好的,这看起来也在过滤您的属性。我向您展示的这种方法是一种解决方案,您可能需要根据您的具体情况进行调整。 (因为我没有您的应用程序的全部上下文)请按照here 的说明进行操作并告诉我。
  • 如上所述 - 这是一个非常标准的 Spring Boot 应用程序,/src/main/resources folder 中有 application.properties
  • 将&lt;resource&gt;&lt;directory&gt;src/main/resources&lt;/directory&gt;&lt;filtering&gt;true&lt;/filtering&gt;&lt;/resource&gt; 添加到您的解决方案中解决了我的问题。
  • 对我来说,这适用于 spring-boot-starter-parent 在版本 1.3.0.RELEASE,但不适用于 1.4.6.RELEASE
【解决方案2】:

您收到的错误消息是找不到 javaMailSender 属性。

您的 pom.xml 中提到的资源路径会覆盖默认资源根路径。

因此 JavaMailSender 正在此新资源路径下查找 jndi 配置或邮件属性,但无法找到它。因此出现错误。

spring.mail.jndi-name=mail/testmail

或

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

【讨论】:

  • 我的application.properties 中有所有这些属性,并且在我添加&lt;resources&gt; 标记之前,电子邮件都可以正常工作。
  • 是的。但据我说,javamailsender 在您在 pom.xml 中添加的新资源路径中查找相同的配置。您能否在 pom.xml 中提供默认资源路径本身并检查问题是否仍然存在..
  • 这是一个非常标准的 Spring Boot 应用程序,application.properties 在 /src/main/resources 文件夹中
【解决方案3】:

实际上是 spring-boot jar 相关问题。由于您使用的是 1.2.6 版本的 spring-boot,它有一些错误,如 javamailsender 问题。您需要将您的 spring boot 版本升级到 1.3.0.release 以上。

在这个ticket#3478 中,邮件发件人问题已针对 spring-boot 进行了修复。 因此您可以升级到最新版本或超过 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>

希望这能解决您的问题。

【讨论】:

    【解决方案4】:

    Lorena Salamanca Spring Boot + Elastic Beanstalk .ebextensions in JAR 提出的解决方案不适用于我...:\

    我的解决方案适用于 Spring 1.5.3.RELEASE

    在项目的根目录中添加 .ebextensions 并在插件部分的末尾添加这个 sn-p:

    <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解压spring boot生成的最终jar,复制根目录下的.ebextensions,再用同名zip(jar)。经过测试并在生产中工作:)

    【讨论】:

    • 您是否也对旧版本进行了测试?
    • 这对我有用。另一个解决方案似乎不那么老套,但我无法让它发挥作用。感谢代码@Javier Arnáiz
    • 说得太快了。它给了我 [Tomcat-startStop-1] ERROR on.apache.catalina.core.ContainerBase - A child container failed during start :(
    • 我在 Spring boot 2.0.0 发行版上对此进行了测试,并且可以正常工作。此外,您提到的解决方案也对我不起作用,因为它没有处理 jar 文件根目录中的 .elasticbeanstalk 文件夹。
    • @drenda files 指令应该被发送到 Beanstalk,告诉它创建一个名为 proxy.conf 的文件,其中包含 client_max_body_size 指令。根据您的错误,听起来“文件:”命令最终出现在 proxy.conf 文件中。我的猜测是您将“文件”命令放在文件夹 .ebextensions/nginx/conf.d 而不是 .ebextensions 中。 (请参阅对stackoverflow.com/questions/18908426/… 的评价最高的答案 - 任何一种方法都可以,但不要混合使用。)希望对您有所帮助
    【解决方案5】:

    我相信在这种情况下使用独立 JAR,使用 Procfile-based configuration 然后将 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
    

    【讨论】:

    • proxy.conf文件的内容应该是什么?
    • @SaurabhPadwekar 您想要覆盖的 nginx 配置。例如,client_max_body_size 150M; 之类的东西会增加默认的客户端最大正文值。
    • 谢谢。我听从了你的建议,它奏效了。
    猜你喜欢
    • 2018-06-05
    • 2020-04-29
    • 2021-03-29
    • 2016-05-12
    • 2017-06-22
    • 2020-07-24
    • 2017-07-02
    • 2018-01-21
    • 2020-02-28
    相关资源
    最近更新 更多