Linux 実行可能ファイルのライブラリを参照する
-
21-09-2019 - |
質問
Javaでアプリケーションを作成し、次を使用して正常にコンパイルしました。 GCJ. 。驚くほどうまくいきましたが、次のような障害に遭遇しました。ライブラリのパスを指定する必要があるため、実行可能ファイルはシェル スクリプト経由でのみ実行できます。
必要なライブラリは SWT、Xerces、GNU-crypto です。
コンパイル時にライブラリを静的にリンクする方法はありますか gcj
, 、それともこれは良い考えではないでしょうか?あるいは、コンパイル中に (相対) ライブラリ パスを指定できますか?
現在、私のシェルスクリプトは次のようになります。
#!/bin/sh
export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH
exec ./MyJavaApp $*
解決
アイデアは、静的フィールド「sys_paths」を null にすることです。 変更された値からパスを構築するようにします。ここの投稿を参照してください (AjaySingh516 による投稿 #223) http://forums.sun.com/thread.jspa?messageID=3744346#3744346
Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");
boolean accessible = field.isAccessible();
if (!accessible)
field.setAccessible(true);
Object original = field.get(clazz);
// Reset it to null so that whenever "System.loadLibrary" is called, it
// will be reconstructed with the changed value.
field.set(clazz, null);
try {
// Change the value and load the library.
System.setProperty("java.library.path", "./libs/");
System.loadLibrary("mylibapr");
} finally {
// Revert back the changes.
field.set(clazz, original);
field.setAccessible(accessible);
}
.
gcj システムプロパティ (見る:libgcj でサポートされる標準プロパティ)
http://gcc.gnu.org/onlinedocs/gcj/System-properties.html
.
解決策#2:コンパイル時にシステム環境変数を設定する
http://linux.die.net/man/1/gcj
このためにはパラメータを使用する必要があります -Djava.library.path=./libs/
と gcj
gcj マニュアル (上記のリンク) から:
--main= クラス名
このオプションは、リンク時に、結果の実行可能ファイルの実行時に「メイン」メソッドが呼び出されるクラスの名前を指定するために使用されます。
-Dname[=値]
このオプションは「--main」とのみ使用できます。これは、name という名前のシステム プロパティと値 value を定義します。値が指定されていない場合は、デフォルトで空の文字列が使用されます。 これらのシステム プロパティはプログラムの起動時に初期化され、実行時に取得できます。 「java.lang.System.getProperty」メソッドを使用します。
私は gcj を使用したことがありませんが、ドキュメントによると、これらのシステム プロパティは実行時に取得できるため、他のシステムにも移植可能です。
以下も参照してください。 http://gcc.gnu.org/wiki/Statively_linking_libgcj?action=show&redirect=Statally+linking+libgcj
他のヒント
あなたの質問の最初の部分に答えるために
GCJのmanページから: 「静的libgcjのリンクlibgcjの不可欠な部分は省略される可能性があります。実行時の負荷クラスへのlibgcj使用反射のいくつかの部分を。リンカはリンク時にこれらの参照を見ていないので、それはクラスに言及を省略することができます。結果は通常は(常にではないが)実行時にスローされる「にClassNotFoundException」。このオプションを使用する場合は注意が使用する必要があります。 "
他のライブラリの静的リンクのために、私はわかりません。私はそれを行うには理由がありませんでした。
Linuxの実行可能ファイルは、Windowsとは異なります。通常は、「ランチャー」または使用しているいくつかのように応じて、上の正確なウィンドウ・システムを持っています。あなたはそれではなく、実行可能ファイル自体のアイコンを設定します。通常、起動スクリプトを使用すると、実行可能ファイルを実行するために必要であることをどのような環境を設定するために使用されています。繰り返しますが、これはすべてのあなたの正確なデスクトップウィンドウシステムに依存します。
なぜあなたはAOTを使用していますか?私は次の資料を読んでお勧めします。それはAOTSのために言及することを欠点の1つは以下の通りである...
ダイナミックアプリケーション。クラスは、実行時に動的アプリケーションの負荷は、アプリケーション開発者に利用できなくてもよいこと。これらは、サードパーティのプラグインは、動的プロキシと実行時などに発生する他のクラスとすることができます。ランタイムシステムは、Javaバイトコードインタプリタおよび/またはJITコンパイラが含まれていなければならないので。