2012-02-13 12 views
3

Windows JREのrt.jarにあるNTSystemクラス(com.sun.security.auth.module.NTSystem)に依存するコードがあります。しかし、クラスをLinuxマシンでコンパイルすると、そのクラスはLinux JDK/JREに付属していないので、失敗します。OS固有のJREに対するコーディング

コードを実行すると、NTSystemクラスとその関数を使用できなくなることがあります。しかし、私のコードは、それが実行されているOSを判断し、適切なクラスを使用するのに十分なほどスマートです。

逆に、Windowsでの開発では、com.sun.security.auth.module.UnixSystemにアクセスできません。私はコンパイル時間の制限のためにこれらのクラスをロードして使用するためにリフレクションを使用する必要がありますか?または、ビルド目的でクラスがすべて入っている特別なrt.jarがありますか?

ありがとうございます。

+0

Javaリフレクションを使用してください - ここのcelsowmの回答を参照してください:http://stackoverflow.com/questions/797549/get-login-username-in-java – Alexander

答えて

0

これらのOS固有のクラスが本当に必要な場合は、それらのソースを取得し、コンパイルしてコンパイルするための独自の小さなライブラリを作成します。あなたがOpenSDKには3つの味(Solarisを含む)があると思いますので、すべての簡単なライブラリを作成するのは難しくないでしょう。

2

ターゲットプラットフォームごとにJAAS設定ファイルを作成するか、単一のJAAS設定で各プラットフォームのentriesを作成します。その後、com.sun。*パッケージを直接使用せずにJava SE APIを使用して情報にアクセスします。これは、Java Authentication and Authorization Service (JAAS)(javax.security.auth。*およびjavax.security.auth.login。*)を介して実行できます。 sampleapp_jaas.configとしてそのエントリ保存

sampleApp { 
    com.sun.security.auth.module.NTLoginModule required debug=false; 
}; 

:次のエントリでJAAS config fileを作成します。次に、Javaが設定ファイルを探すようにシステムプロパティを設定します。

-Djava.security.auth.login.config==sampleapp_jaas.config 

二重等価は特別な意味を持つことに注意してください。ロード順序の詳細については、com.sun.security.auth.login.ConfigFileを参照してください。

次に、JAAS設定のエントリを探すLoginContextを作成します。件名を入力するにはログインを呼び出します。そこから、件名のAPIを使用して情報にアクセスできます。たとえば、次の例では、現在のユーザーに割り当てられたグループを一覧表示します。この設定を使用して

LoginContext l = new LoginContext("sampleApp"); 
l.login(); 
try { 
    Subject s = l.getSubject(); 
    for (Principal p : s.getPrincipals()) { 
     System.out.println(p); 
    } 
} finally { 
    l.logout(); 
} 

、Javaは情報を得るためにcom.sun.security.auth.module.NTSystemクラスを使用しますが、あなたのコードはいずれも非標準APIに配線されません。

関連する問題