2012-02-19 8 views
2

実行時にポートレットのプロパティファイルを変更したいと思います。ポートレットはTomcat 7.0.23にデプロイされ、プロパティー・ファイルは「/ WEB-INF/classes/content」にあります。ここから、次のコードを使用してアクセスできます。実際、コードは例外なく実行されますが、新しく追加されたプロパティはプロパティファイルに保存されません。実行時にTomcatのプロパティファイルを変更します。

String fileName = "MyProps.properties"; 
String relativePath = "/WEB-INF/classes/content/"; 
String fullPath = "c:/tomcat-7.0.23/webapps/my-portlet/WEB-INF/classes/content/"; 
try { 
    String path = relativePath + fileName; 
    InputStream in = getPortletContext().getResourceAsStream(path); 
    Properties props = new Properties(); 
    props.load(in); 
    props.setProperty("test", "test"); 
    File file = new File(fullPath + fileName)); 
    FileOutputStream out = new FileOutputStream(file); 
    props.store(out, ""); 
} catch(Exception ex) { // error handling here} 

新しいプロパティを追加した後、私はそれが実際に追加されたことを

props.list(System.out); 

で確認してください可能性があります。 context.xmlファイルは、次のエントリが含まれています

antiJARLocking="true" 
antiResourceLocking="true" 

これは、実行中のTomcatインスタンスに/変更のプロパティを追加するか、私は別のアプローチをとるべき正しい道ですか?後者の場合、どのようにして最善を尽くすことができますか?

ご回答いただきありがとうございます。

+0

'FileOutputStream out = new FileOutputStream(file);で' file'を置き換えてみます。 'getPortletContext()。getRealPath(relativePath + fileName)'によって、 ' 'を返します。 –

答えて

4

あなたは間違いないは、今までにデプロイされたWebアプリケーションに含まれるファイルを変更することができることに依存している必要があります。その時点でコントロールがコンテナに渡され、ファイルが上書きされるか、書き込みが不可能になることさえあります。また、展開されたWARフォルダ(存在する場合)を吹き飛ばしてアーカイブを再デプロイすることもできないため、アプリケーションデプロイヤに負担がかかります。

代わりに、プロパティファイルをWebアプリケーションの外部に配置することを検討してください。

  1. ランタイムプロパティファイルが ホストされている、またはデプロイヤは良く 既知の特性を経由してこの場所を指定できるようになります「よく知られた」場所を決定します。私は正常に使用見てきた一つのアプローチはこれです。
  2. この場所からプロパティファイルを読み取ろうとしています。 が存在しない場合は、アプリケーションの に格納されているテンプレートから作成して初期化します。
  3. アプリケーションの実行中に加えられたすべての変更をこの 外部プロパティファイルに保存します。

この設定では、ファイルを書き込めない、またはコンテナによって上書きされることを心配する必要はありません。

+0

あなたは私の考えを読んで、完璧です。 –

関連する問題