web-dev-qa-db-ja.com

Spring Boot + Elastic Beanstalk .ebextensions in JAR

非常に標準的なSpringBootアプリケーション(標準の_application.properties_フォルダーにある_/src/main/resources_プロパティファイルを使用)があり、AWS ElasticBeanstalkに「ファット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>
_

皆さんの助けに感謝します!

12
bobmarksie

Lorena Salamancaによって提案された解決策 JARのSpring Boot + Elastic Beanstalk .ebextensions 私には機能しません...:\

私のソリューションはSpring1.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を使用して、Spring Bootによって生成された最終的なjarを解凍し、ルートの.ebextensionsをコピーして、同じ名前で再度Zip(jar)します。テストされ、本番環境で動作しています:)

5
Javier Arnáiz

これは、JARで機能するようにするpomスニペットです。

<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ファイルのルートに移動する と同じように機能します。

実はこれにサンプルをアップロードしました repomvn package

7
imTachu

この場合、スタンドアロンのJARが使用されていると思います。 Procfileベースの構成 を使用して、JARと.ebextensionsをZipファイルにバンドルする方が簡単です。

まず、プロジェクトのルートにProcfileという名前のファイルを次の内容で作成します。

web: Java -jar sample_app-1.0.0.jar

次に、JARとProcfileファイルおよび.ebextensionsディレクトリを含むZipファイルを作成します。

sample_app.Zip
|
|_.ebextensions
|   |_ nginx
|      |_ conf.d
|         |_ proxy.conf
|
|_ sample_app-1.0.0.jar
|_ Procfile
2
Khashayar

実はスプリングブートjar関連の問題です。 1.2.6バージョンのspring-bootを使用しているため、javamailsenderの問題などのバグがあります。 SpringBootバージョンを1.3.0.releaseよりもアップグレードする必要があります。

この ticket#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>

これで問題が解決することを願っています。

0
SkyWalker

表示されるエラーメッセージは、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
0
Tiny