STSで作成した実行可能JARで、auto-wireに関するエラーが発生する
はじめまして。
当方、.Net系の経験はありますがJavaはあまり経験ないので、色々Java界の常識をすっ飛ばしていることがあるかもしれません。遠慮なくご指摘ください。。
Windows環境のSTSでバッチを作り、実行可能JARとしてMaven Installで作成したJARでLinuxサーバ(CentOS 7)上で実行したところ、実行時エラーが発生しました。(以下Log4jエラーログ抜粋)
※BBBB01はプログラム名です。
メッセージでStackOverflowなどの海外サイトともかなり格闘しましたが有力な情報にはあたらず。
設定もいろいろ試してみましたが、改善しませんでした。
このエラーの原因が何で、解消方法はどうなりますでしょうか?
ターゲットバージョンは1.8です。
YYYY-MM-DD 13:49:33,413 ERROR CommandLineJobRunner - Job Terminated in error: Error creating bean with name 'BBBB01Configuration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.batch.core.repository.JobRepository com.batch.XXXXXXX.BBBB01Configuration.jobRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobRepository': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${batch.jdbc.driver}'
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BBBB01Configuration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.batch.core.repository.JobRepository com.batch.XXXXXX.BBBB01Configuration.jobRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobRepository': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${batch.jdbc.driver}'
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
====
プロパティファイルをautowireする前後でエラーが発生しているようにみえるので、関連しそうな情報です。
●プロパティファイルは2つあり、いずれもsrc/main/resourcesにおいてあります。
(1)batch.properties
(2)log4j.properties
実行環境にはjarを配置したディレクトリに(1)(2)を個別配置済。
(1)にはHSQLDBの一般的な設定↓の他、プログラム固有の設定をいくつか追加しています。
# Placeholders batch.*
# for HSQLDB:
batch.jdbc.driver=org.hsqldb.jdbcDriver
batch.jdbc.url=jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true
# use this one for a separate server process so you can inspect the results
# (or add it to system properties with -D to override at run time).
# batch.jdbc.url=jdbc:hsqldb:hsql://localhost:9005/samples
batch.jdbc.user=sa
batch.jdbc.password=
batch.schema=
batch.schema.script=classpath:/org/springframework/batch/core/schema-hsqldb.sql
●launch-context.xmlは、beans配下に以下の定義。
<context:property-placeholder order="1" location="classpath:batch.properties" />
<context:property-placeholder order="2" location="classpath:log4j.properties" />
<context:annotation-config/>
<context:component-scan base-package="com.batch.XXXXXX" />
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>
<batch:job-repository id="jobRepository" />
<import resource="classpath:/META-INF/spring/module-context.xml" />
●Maven(maven-shade-plugin)で生成されるマニフェストファイル。
Manifest-Version: 1.0
Package: com.batch.XXXXXX
Build-Number: 1
Archiver-Version: Plexus Archiver
Built-By: xxxxxxxxx
Class-Path: ./
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_102
Main-Class: org.springframework.batch.core.launch.support.CommandLineJ
obRunner
※なぜか改行が入っていますが、これが原因ではなさそうでした。
●POMの抜粋
■properties
<properties>
<maven.test.failure.ignore>true</maven.test.failure.ignore>
<spring.framework.version>3.0.6.RELEASE</spring.framework.version>
<spring.batch.version>2.1.7.RELEASE</spring.batch.version>
<configFileBatch>batch.properties</configFileBatch>
<configFilelog4j>log4j.properties</configFilelog4j>
</properties>
■build
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<index>false</index>
<manifest>
<packageName>com.batch.xxxxxx</packageName>
<mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<finalName>BBBB01</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>org.springframework.batch.core.launch.support.CommandLineJobRunner</Main-Class>
<Class-Path>./</Class-Path>
<Build-Number>1</Build-Number>
</manifestEntries>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>.properties</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
<archive>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
</configuration>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
以上