5

Java のブートストラップ クラス (rt.jar または同等のもの) を含む jar を確実に見つけるにはどうすればよいですか? 以下のコードを使用していましたがJAVA_HOME、JRE ではなく JDK を参照するために使用されており、JDK がインストールされていない場合は完全に失敗することがわかりました。

def findJRE():
    try:
        home = os.environ['JAVA_HOME']
        path = os.path.join(home, 'jre', 'lib', 'rt.jar')
        if os.path.isfile(path):
            return path

        #For macs
        path = os.path.join(home, 'bundle', 'Classes', 'classes.jar')
        if os.path.isfile(path):
            return path
    except Exception as e:
        pass
4

2 に答える 2

3

ファイルの場所と名前はプラットフォームによって異なり、それを指す環境変数がないように見えるため、ファイルシステムでファイルを探すのが最善の策だと思います。

#!/usr/bin/env python
import subprocess
import re

rtjarPaths = subprocess.check_output(["locate", "rt.jar"])
paths = re.findall('^.*/jre/.*$', rtjarPaths, re.M)
print paths

vicent@deckard:~$ python findrt.py 
['/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar']

上記のコードは、Ubuntu ボックスで問題なく動作します。MacOS X でも動作するように簡単に拡張できます。他の Linux ディストリビューションでも、コードを変更する必要がある場合があります。

更新: いくつかのグーグル検索の後、Oracle のドキュメントで、rt.jarファイルがsun.boot.class.pathシステム プロパティに格納されているパスにあることがわかりました。残念ながら、このプロパティを Python またはコマンド ラインから直接取得する方法がわからないため、前のコードに代わる次の汚い代替手段しか提供できません。

PropertiesTest.java を作成してコンパイルします。

public class PropertiesTest {
    public static void main(String[] args)
        throws Exception {
        String value = System.getProperty("sun.boot.class.path");
        System.out.println(value);
    }
}

次に、次の Python スクリプトを実行します。

#!/usr/bin/env python
import subprocess
import re

jrePaths = subprocess.check_output(["java", "PropertiesTest"])
rt = re.findall('(?:.*:)?(.*/(?:rt|classes)\.jar):?', jrePaths)
print rt

Linux と MacOS X の両方のプラットフォームで動作するはずです。私のUbuntuシステムでは、出力が得られます

['/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar']
于 2012-10-20T09:46:56.313 に答える