0

Spring + Spring Data + Hibernate機能を備えた単純なJARを作成しようとしています。これは、SpringまたはHibernate + JPAを区切りにしたときに機能しますが、すべてをまとめているときは機能しません。Spring + SpringデータJava SE JPAスタンドアロン

このタイプの設定は可能ですか?

私はMavenアセンブリプラグインを使用して依存関係のあるJARを作成しています。

JPAエンティティをスキャンする具体的なパッケージも示していますが、これはEclipseで動作しますが、単一のJARを実行すると動作しません。

私の構成はXMLフリーです(persistence.xmlまたはapplication.xmlはありません)。これでpersistence.xmlが検索されます。 META-INF/persisntece.xmlにファイルを置くと、エラーは同じです。

更新:ConfigPersistence

@Configuration 
@ComponentScan(basePackageClasses=_PackageTypeSafeClassModel.class) 
@EnableJpaRepositories(basePackageClasses=_PackageTypeSafeClassModelRepositories.class) 
@EnableTransactionManagement 
@Import(ConfigProperties.class) 
public class ConfigPersistence { 

    private static final Logger LOGGER = LoggerFactory.getLogger(LogNames.CONFIGURATION.toString()); 

    /* Connection properties */ 
    @Value("${db.user}") private String propDBUser; 
    @Value("${db.pass}") private String propDBPass; 
    @Value("${db.host}") private String propDBHost; 
    @Value("${db.port}") private String propDBPort; 
    @Value("${db.database}") private String propDBDatabase; 

    /* Pool properties */ 
    @Value("${db.pool.datasource}") private String propDatasource; 
    @Value("${db.pool.setMinimumIdle}") private Integer propSetMinimumIdle; 
    @Value("${db.pool.setIdleTimeout}") private Integer propSetIdleTimeout; 
    @Value("${db.pool.setMaximumPoolSize}") private Integer propSetMaximumPoolSize; 
    @Value("${db.pool.setConnectionTimeout}") private Integer propSetConnectionTimeout; 

    /* Hibernate properties */ 
    @Value("${db.hibernate.hbm2ddl.auto}") private String propHibernateHbm2ddl; 
    @Value("${db.hibernate_dialect}") private String propHibernateDialect; 
    @Value("${db.hibernate.show_sql}") private String propHibernateShowSql; 
    @Value("${db.hibernate.format_sql}") private String propHibernateFormatSql; 
    @Value("${db.hibernate.generate_statistics}") private String propHibernateStatistics; 
    @Value("${db.hibernate.use_sql_comments}") private String propHibernateSqlComments; 
    @Value("${db.hibernate.connection.autocommit}") private String propHibernateAutocommit; 
    @Value("${db.hibernate.mapping.precedence}") private String propHibernatePrecedence; 

    @Bean 
    public EntityManagerFactory entityManagerFactory() { 

     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPackagesToScan(_PackageTypeSafeClassModelEntities.class.getPackage().getName()); 
     entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
     entityManagerFactoryBean.setJpaProperties(hibernateProperties());   
     entityManagerFactoryBean.afterPropertiesSet(); 

     return entityManagerFactoryBean.getObject(); 
    } 

    @Bean 
    public DataSource dataSource() { 

     HikariDataSource hikariDS = new HikariDataSource(); 

     /* Hikari Pool configuration */ 
     hikariDS.setPoolName("HikariCP pool"); 
     hikariDS.setDataSourceClassName(propDatasource); 
     hikariDS.setMinimumIdle(propSetMinimumIdle); 
     hikariDS.setIdleTimeout(propSetIdleTimeout);    // Minutes 
     hikariDS.setMaximumPoolSize(propSetMaximumPoolSize);  // Connection pool size 
     hikariDS.setConnectionTimeout(propSetConnectionTimeout); // Miliseconds 

     /* Database configuration */ 
     hikariDS.addDataSourceProperty("serverName", propDBHost); 
     hikariDS.addDataSourceProperty("portNumber", propDBPort); 
     hikariDS.addDataSourceProperty("databaseName", propDBDatabase); 
     hikariDS.addDataSourceProperty("user", propDBUser); 
     hikariDS.addDataSourceProperty("password", propDBPass); 

     LOGGER.info("Database connection to: {}:{}, database {} with user {}", 
       propDBHost, propDBPort, propDBDatabase, propDBUser);  

     return hikariDS; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory()); 
     return transactionManager; 
    } 

    @Bean 
    public HibernateExceptionTranslator hibernateExceptionTranslator() { 
     return new HibernateExceptionTranslator(); 
    } 

    private Properties hibernateProperties(){ 

     Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("hibernate.dialect", propHibernateDialect); 
     hibernateProperties.setProperty("hibernate.ejb.entitymanager_factory_name", "myEntityManager"); 
     hibernateProperties.setProperty("hibernate.hbm2ddl.auto", propHibernateHbm2ddl); 
     hibernateProperties.setProperty("hibernate.show_sql", propHibernateShowSql); 
     hibernateProperties.setProperty("hibernate.format_sql", propHibernateFormatSql ); 
     hibernateProperties.setProperty("hibernate.generate_statistics", propHibernateStatistics); 
     hibernateProperties.setProperty("hibernate.use_sql_comments", propHibernateSqlComments); 
     hibernateProperties.setProperty("hibernate.connection.autocommit", propHibernateAutocommit); 
     hibernateProperties.setProperty("hibernate.mapping.precedence", propHibernatePrecedence); 

     LOGGER.info("Setting {} hibernateProperties {}", hibernateProperties.size(), hibernateProperties);  
     return hibernateProperties; 
    } 

} 

私は取得していますエラー:

Caused by: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL 
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:591) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:443) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:424) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:310) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) ~[company-monitor-jar-with-dependencies.jar:na] 
    at com.company.config.ConfigPersistence.entityManagerFactory(ConfigPersistence.java:88) ~[company-monitor-jar-with-dependencies.jar:na] 
    at com.company.config.ConfigPersistence$$EnhancerBySpringCGLIB$$a1e8e6cc.CGLIB$entityManagerFactory$1(<generated>) ~[company-monitor-jar-with-dependencies.jar:na] 
    at com.company.config.ConfigPersistence$$EnhancerBySpringCGLIB$$a1e8e6cc$$FastClassBySpringCGLIB$$17999b5a.invoke(<generated>) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318) ~[company-monitor-jar-with-dependencies.jar:na] 
    at com.company.config.ConfigPersistence$$EnhancerBySpringCGLIB$$a1e8e6cc.entityManagerFactory(<generated>) ~[company-monitor-jar-with-dependencies.jar:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_91] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_91] 
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_91] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[company-monitor-jar-with-dependencies.jar:na] 
    ... 13 common frames omitted 
Caused by: java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist 
    at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:187) ~[company-monitor-jar-with-dependencies.jar:na] 
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:588) ~[company-monitor-jar-with-dependencies.jar:na] 
    ... 28 common frames omitted 
[ERROR][CONFIGURATION] - [Main.java:30] - 24/05/2016 11:57:05.614 - Exception: Error creating bean with name 'entityManagerFactory' defined in com.company.config.ConfigPersistence: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.persistence.EntityManagerFactory]: Factory method 'entityManagerFactory' threw exception; nested exception is javax.persistence.PersistenceException: Unable to resolve persistence unit root URL 

更新:POM依存関係が

<dependencies> 

     <!-- Spring Boot dependencies --> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
      <exclusions> 
       <exclusion> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jdbc</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <exclusions> 
       <exclusion> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-tomcat</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.apache.tomcat.embed</groupId> 
        <artifactId>tomcat-embed-el</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-undertow</artifactId> 
      <exclusions> 
       <exclusion> 
        <groupId>io.undertow</groupId> 
        <artifactId>undertow-websockets-jsr</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

     <!-- Databases dependencies --> 
     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc6</artifactId> 
      <version>${database.oracle.version}</version> 
     </dependency> 

     <!-- Hibernate dependencies --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
     </dependency> 

     <!-- Connection pool --> 
     <dependency> 
      <groupId>com.zaxxer</groupId> 
      <artifactId>HikariCP</artifactId> 
     </dependency> 

     <!-- Logging: SL4J and LogBack dependencies --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
     </dependency> 

     <!-- JCommander --> 
     <dependency> 
      <groupId>com.beust</groupId> 
      <artifactId>jcommander</artifactId> 
      <version>${jcommander.version}</version> 
     </dependency> 

    </dependencies> 
+1

私はSpring Bootを使用して実行可能なjarファイルを作成し、頭痛を軽減することをお勧めします。関係なく、あなたの 'ConfigPersistence'を質問に追加できますか? –

+0

私はSpringBootを検討していますが、私の現在の環境にとっては重すぎると思います。メモリのパフォーマンスを考慮して、SpringBootでスタンドアロンのアプリケーションの例がありますか? – crm86

+0

それはなぜでしょうか?ブートを実行しているコマンドラインアプリケーションと、実行しているコマンドラインアプリケーションが異なる理由Spring Bootは、Tomcatやその他のものを持っている必要があるということを意味するわけではありません。普通のコマンドラインの場合は、これを使うことができます。違いはありません。ここでの主な問題は、変更されたjarファイルにクラスパスのトリックがいくつかあることです。これは、春の読み込みには不公平なので、いくつかのトリッキーが必要です。また、メモリとパフォーマンスについての仮定を行うのではなく、実行できることは1つだけあり、それは自分のためのテストです! –

答えて

0

スタックトレースを提供するよると、使用しているLocalContainerEntityManagerFactoryBean

LocalContainerEntityManagerFactoryBeanは、JPAの標準コンテナブートストラップ契約に従ってJPAのEntityManagerFactoryを作成します(source

しかし、春にもLocalEntityManagerFactoryBean

LocalEntityManagerFactoryBeanを提供は、JPAの標準スタンドアロンに従ってJPAのEntityManagerFactoryを作成しますブートストラップコントラクト(source

まず、LocalEntityManagerFactoryBeanを使用します。すべての問題を解決するかどうかはわかりませんが、コンテナ内で実行していない場合は、少なくとも最初のステップです。

+0

良い提案ですが、データソースと永続化プロバイダ(休止状態)をカスタマイズしたいLocalContainerEntityManagerFactoryBeanをドキュメンテーションで示したとおりに使用する必要があります – crm86

+0

LocalContainerEntityManagerFactoryBeanとまったく同じように、LocalEntityManagerFactoryBeanでデータソースとpersistenceProviderをカスタマイズできます – ben75

0

maven-assembly-pluginを使用して解決策を試す代わりに、私はSpring Bootを使用することをお勧めします。これは、適切なクラスローダーの設定など、既にそのようなことを処理します。

構成をapplication.propertiesに翻訳してから、Spring Boot property namesを使用します。次に、設定クラスを削除するだけで済みます(Spring Bootは自動的にあなたのクラスパスにあるものを検出し、それに応じて設定します)。

移行戦略として、独自の設定クラスから始めて、実行してから、あなたに提供されているすべてのものを削除することができます(基本的にここに示したすべてです)。

次に、(すべてのパッケージをカバーするようにトップレベルパッケージに)スタータークラスを作成します。

@SpringBootApplication 
public class MyApplication { 

    public static void main(String... args) throws Exception { 

     SpringApplication.run(MyApplication.class, args); 
    } 
} 

あなたの依存関係は次のようになります。 (あなたの質問から推測されますが、私はもう少しあると思います)。

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.zaxxer</groupId> 
     <artifactId>HikariCP</artifactId> 
    </dependency> 
</dependencies> 

これは、プロジェクトの親としてSpringブートを使用していることを前提としています。

アセンブリプラグインの代わりに、スプリングブートプラグインを使用します。

<!-- Package as an executable jar --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

これで、実行可能なjarファイルが得られるようになり、アプリケーションを自動的にブートストラップすることができます。

+0

私はSpring Bootで試していますが、メモリは本当に大きな問題です。私がJSE + Hibernate + Springで作業していたとき、私は約50〜70MBを使用していましたが、Spring Bootは約500MB〜700MBでした。どのようなアイデアは、春のブートメモリとどのようにすべてをロードするのを避けるために対処するには? – crm86

+0

どのくらい読み込まれ、何が使用されているかは、依存関係によって異なります。あなたの依存関係を見ることなく、何が間違っているかを見ることは難しいです。 –

+0

私はPOMの依存関係を取り入れました – crm86

関連する問題