1. ホーム
  2. java

[解決済み] JARファイル外のプロパティファイルの読み込み

2022-05-17 03:21:30

質問

私は、実行するためにすべての私のコードがアーカイブされているJARファイルを持っています。私は、各実行の前に変更/編集する必要があるプロパティ ファイルにアクセスする必要があります。私は、JARファイルがあるのと同じディレクトリにプロパティファイルを維持したい。そのディレクトリからプロパティファイルをピックアップするようにJavaに指示する方法はありますか?

注:私は、プロパティファイルをホームディレクトリに保持したり、コマンドライン引数でプロパティファイルのパスを渡したりしたくありません。

どのように解決するのですか?

ということで .properties ファイルを main/runnable jar のリソースとしてではなく、ファイルとして扱いたいのですね。その場合、私なりの解決策は以下のようになります。

まず最初に、プログラムファイルのアーキテクチャは次のようになります (メインプログラムが main.jar で、そのメインプロパティファイルが main.properties だと仮定しています)。

./ - the root of your program
 |__ main.jar
 |__ main.properties

このアーキテクチャでは、main.properties ファイルは単なるテキストベースのファイルなので、main.jar の実行前または実行中に(プログラムの現在の状態に応じて)任意のテキスト エディタを使用してプロパティを変更することができます。例えば、main.properties ファイルには以下のようなものがあります。

app.version=1.0.0.0
app.name=Hello

そこで、メインプログラムをそのルート/ベースフォルダから実行すると、通常はこのように実行されます。

java -jar ./main.jar

または、ストレートに

java -jar main.jar

main.jar では、main.properties ファイルにあるすべてのプロパティに対して、いくつかのユーティリティ・メソッドを作成する必要があります。 app.version プロパティには getAppVersion() メソッドを次のように使用します。

/**
 * Gets the app.version property value from
 * the ./main.properties file of the base folder
 *
 * @return app.version string
 * @throws IOException
 */

import java.util.Properties;

public static String getAppVersion() throws IOException{

    String versionString = null;

    //to load application's properties, we use this class
    Properties mainProperties = new Properties();

    FileInputStream file;

    //the base folder is ./, the root of the main.properties file  
    String path = "./main.properties";

    //load the file handle for main.properties
    file = new FileInputStream(path);

    //load all the properties from this file
    mainProperties.load(file);

    //we have loaded the properties, so close the file handle
    file.close();

    //retrieve the property we are intrested, the app.version
    versionString = mainProperties.getProperty("app.version");

    return versionString;
}

メインプログラムの中で app.version の値を必要とするメインプログラムのどの部分でも、次のようにそのメソッドを呼び出します。

String version = null;
try{
     version = getAppVersion();
}
catch (IOException ioe){
    ioe.printStackTrace();
}