0

Web Glassfish - Java EEベースのWebアプリケーションで作業する必要があり、複数の環境にアプリケーションをデプロイする必要があります。また、envアプリが展開されます。 どうすればこれらの設定を行うことができますか?例えば、私のorm.xmlで、私はこの環境に依存するプロパティ - glassfish(NO Spring)

<?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" version="1.0"> 
    <persistence-unit-metadata> 
     <persistence-unit-defaults> 
      <schema>DevSchema</schema>    
     </persistence-unit-defaults> 
    </persistence-unit-metadata> </entity-mappings> 

どのように私は、例えば、ProdSchemaにDevSchemaを変更することができるようなものを

がありますか? 2つのプロパティファイルがあるとします。 dev.propertiesおよびprod。プロパティ。どのように私は適切なファイル依存の値をenvで使用できますか?

ありがとうございます!

+0

Glassfishのコマンドラインを使用して、多数のパラメータを設定できます。 [このKB記事](http://docs.oracle.com/cd/E18930_01/html/821-2416/gglpq.html)では、JNDIプロパティを設定する方法を示しています。[this one](https://glassfish.java .net/javaee5/persistence/entity-persistence-support.html)には、コマンドラインで設定できる他のパラメータのリストがあります。だから、段階的な展開では、環境ごとに異なるコマンドラインパラメータ – kolossus

答えて

1

Mavenを使用してアプリケーションを構築する場合、Maven resource filteringからpersistence.xmlを生成すると便利です。 "DevSchema"をプロパティファイルのキーに置き換えて、Mavenリソースプラグイン設定の<filter>タグでファイルを指定してください(詳細は上のリンクを参照してください)。

しかし、これは異なる環境の2つの異なるWARアーティファクトで終了することを意味します。これは一般に反パターンとみなされます。両方の成果物を追跡しなければならず、アーティファクト・リポジトリ(ある場合)はほぼ重複したWARを保持します。単一のアーティファクトをすべての配置に使用することが一般に好ましい。そのためには、すべての永続ユニットを単一のpersistence.xmlで異なる名前で定義し、CDIを使用して適切なものを選択することができます。これは、少なくとも2つの方法で行うことができます。

プロデューサメソッド使用
  1. :いくつかの他のBeanのフィールドにEntityManagerを注入するため

    @PersistenceContext(unitName = "DevPU") 
    private EntityManager devEM; 
    
    @PersistenceContext(unitName = "ProdPU") 
    private EntityManager prodEM; 
    
    @Produces @MyDB EntityManager getEM() { 
        // Here you must detect your current environment and return the appropriate entity manager 
    } 
    

    を:

    @Inject @MyDB private EntityManager em; 
    

    あなたがデフォルト以外のことを示すために、あなたの@MyDB注釈タイプを定義する必要がありますEntityManagerを注入する必要があります(デフォルトはアプリケーションサーバーによって選択されます)。

  2. 使用プロデューサーフィールド:次の2つの注釈の種類、@ProdDB@DevDBを定義する必要がありますが、ここで

    @Inject private Instance<EntityManager> instance; 
    
    void foo() { 
        // this could be ProdDB as well, depending on the environment 
        EntityManager em = instance.select(DevDB.class).get(); 
    } 
    

    、および動的(javax.enterprise.inject.Instance注射を介していずれかを選択します。

    @Produces 
    @DevDB 
    @PersistenceContext(unitName = "DevPU") 
    private EntityManager devEM; 
    
    @Produces 
    @ProdDB 
    @PersistenceContext(unitName = "ProdPU") 
    private EntityManager prodEM; 
    

    はEntityManagerを注入するためにまたはパラメータ付きの単一の注釈タイプにすることができます)。

+0

こんにちは。レスポンスありがとう!残念ながら、Antを使用しています。 Antにも同様の機能がありますか? – 0x56794E

+0

['filter'](https://ant.apache.org/manual/Tasks/filter)があります。html)Antタスクは['copy'](https://ant.apache.org/manual/Tasks/copy.html)タスクと連携して動作し、全く同じことをします。 – Dimitri

関連する問題