3

バージョン管理ツールにファイルとして保存されたスクリプトとデータベースにロードされたスクリプトを比較する Java プログラムを作成しました。これは単純なプログラムで、最初から最後まで実行され、不一致が見つかるとコンソールに出力されます。ここで、データベースの URL、ユーザー名、パスワード、およびファイルの場所を .properties ファイルから読み込みたいと考えています。

ファイルをクラスパスに配置すると、Java プログラムから表示されると想定しました。

Properties values = new Properties();
try
{
    File checkPackages = new File("myfile.properties");
    if(!checkPackages.exists()) throw new FileNotFoundException();

    values.load(new FileReader(checkPackages));
}
catch(FileNotFoundException fnfe) {}

また、このプログラム全体を .jar ファイルに保存して、もう少し使いやすくしたいと思いました。残念ながら、.properties ファイルを参照する唯一の方法は、java.exe を実行しているディレクトリにファイルを配置することです。PATH または CLASSPATH が適用されないようです??

そこに答えがあることを望んでいたので、.jar ファイルのマニフェスト ファイルに関する Oracle サイトを見つけましたが、マニフェストの Class-path: 要素は、.jar に含まれていない .jar ファイルのみを参照しているようです ( .properties ファイルではありません!) 質問: .properties ファイルを .jar ファイルにラップして、ユーザーがそこにあることを知る必要がないようにする方法はありますか? Oracle ドライバー .jar をアプリの .jar にラップして、ユーザーがそこにあることを知る必要がないようにする方法はありますか (Oracle は、これには「カスタム コード」が必要だと言っています)。

ティア

4

3 に答える 3

1

アプローチの 1 つは、-D スイッチを使用して、Java コマンド ラインでシステム プロパティを定義することです。そのシステム プロパティには、プロパティ ファイルへのパスが含まれている場合があります。

例えば

java -cp ... -Dmyproject.properties=/path/to/my.app.properties my.package.App

ここで説明されているように、コードでプロパティをフェッチします。

String propPath = System.getProperty( "myproject.properties" );

final Properties myProps;

final FileInputStream in = new FileInputStream( propPath );

 try
 {
     myProps = Properties.load( in );
 }
 finally
 {
     in.close( );
 }
于 2013-06-01T14:14:44.197 に答える
1

ClassLoader#getResource()およびClassLoader#getResourceAsStream()メソッドを使用して、(JAR に封印されている場合でも) クラスパス内のリソースを取得できます。

例えば:

Properties values = new Properties();
values.load(ThisClass.class.getClassLoader().getResourceAsStream("myproject.properties"));
// umm, don't forget to close the stream, this code is just an example usage

ユーザー名とパスワードをプログラム内の任意のデータベースに保存することは、重大なセキュリティ リスクと見なされることに注意してください。

于 2013-06-01T14:25:17.137 に答える
0

機密データ (この場合はユーザー名、パスワード、URL) を隠すのではなく、公開鍵と秘密鍵で暗号化することをお勧めします。結局のところ、任意の jar ファイル (基本的には zip 形式) を圧縮して.propertiesファイルを追跡することは難しくありません。

于 2013-06-01T14:01:09.200 に答える