2017-09-01 5 views
0

すべてのjarファイルには、ビルドの特定の情報を含む特定のファイルversion.propertiesが含まれています。同一のjarファイルにアクセスする

(クラスパス上のいくつかのjarを使用して)コマンドラインからjarを起動すると、version.propertiesにはと同じ jarにアクセスします。より正確には、呼び出し元のクラスファイルが存在するjarにプロパティファイルの内容を与えるJavaコードを記述します。

問題は、クラスパス上のすべてのJARファイルにversion.propertiesが含まれていることです。クラスパス上の最初の読み込みはしませんが、正しいjarファイルからの読み込みは不要です。どうすればそれを達成できますか?

+0

のJava用途有していないので、私は、一緒にMETA-INFの例とアクセスMANIFEST.MFとしてString.classを用いた例をハッキング正当な理由のためにパッケージ。なぜ適切なパッケージにversion.propertiesを設定しないのですか? –

+0

version.propertiesは各jarのメインディレクトリにあります。これは変更できません(会社標準) –

+0

クラスローダーを使用することはできません。代わりに、クラスが存在するjarを見つけるために汚れたトリックを使用し、そのjarへのjar入力ストリームを開き、version.propertiesエントリを探してからこのエントリを読んでください。あるいは、会社標準を変更して、それを使用可能な標準にすることもできます。 –

答えて

1

面白い問題。特定のjarの代表クラスの場所を見つけ、その結果を使用してプロパティファイルのURLを構築する必要があります。 rt.jarのそれにはプロパティを(少なくともクイックjar tf rt.jar | grep propertiesがゼロ結果が得られた)

Class clazz = String.class; 
    String name = clazz.getName().replace('.', '/') + ".class"; 
    System.out.println(name); 
    String loc = clazz.getClassLoader().getResource(name).toString(); 
    System.out.println(loc); 
    if (loc.startsWith("jar:file")) { 
     String propertyResource = loc.substring(0, loc.indexOf('!')) + "!" + "/META-INF/MANIFEST.MF"; 
     InputStream is = new URL(propertyResource).openStream(); 
     System.out.println(propertyResource); 
     Properties props = new Properties(); 
     props.load(is); 
     System.out.println(props.get("Implementation-Title")); 
    } 
関連する問題