- PR -

すべてのJavaプログラムにあるVM引数を必ず渡すには?

投稿者投稿内容
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-09-05 15:48
システム上で起動するすべてのJavaプログラムに、VM引数(-Dsun.java2d.noddraw=true)を必ず渡すようにしたいのですが、方法をご存じの方いらっしゃいませんか?

今は java.exe と javaw.exe をそれぞれ java_def.exe と javaw_def.exe にリネームして、ShellExecute や execvp で それらに編集した引数を渡す java.exe を javaw.exe を作って置き換えるという、面倒なことをしています。できれば、もっと安全で確実な方法が知りたいです。

何でも結構です。情報、お待ちしてます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-09-05 16:14
unibon です。こんにちわ。

引用:

oceanさんの書き込み (2003-09-05 15:48) より:
システム上で起動するすべてのJavaプログラムに、VM引数(-Dsun.java2d.noddraw=true)を必ず渡すようにしたいのですが、方法をご存じの方いらっしゃいませんか?


以下、外していそうですが、
アプリケーションプログラム側の main メソッドの先頭に、
コード:
public static void main(String[] args) {
    System.setProperty("sun.java2d.noddraw", "true");
    System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    ...
}


と書くとおそらく効きます。
(sun.java2d.noddraw の効果は分かりにくいので未確認ですが、
swing.defaultlaf のほうは効きました。)

でも、これではダメなんですよね。
ダメ元で、
C:\j2sdk1.4.2\jre\lib\i386\jvm.cfg
に書けそうな気もしたので試してみましたが、
ダメっぽそうでした(これもあまり確かではないけど)。
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-09-05 17:12
レスありがとうございます。

引用:

でも、これではダメなんですよね。



アプレットとか、人の作ったプログラムとか、すべてに渡したいので・・・・

引用:

ダメ元で、
C:/j2sdk1.4.2/jre/lib/i386/jvm.cfg
に書けそうな気もしたので試してみましたが、
ダメっぽそうでした(これもあまり確かではないけど)。



コメントを読むと、複数のVMの切り替え用にあるファイルみたいですね。危険な香りがしたので、試せませんでした。
ウラタン
常連さん
会議室デビュー日: 2003/07/25
投稿数: 29
投稿日時: 2003-09-05 18:02
ちと汚いやり方ですが、バッチで解決する手もあります。

自作の「java.bat」を作って、そのバッチ内で勝手に「-Dxxxx」を付け加えて
「java.exe」を叩くようにする・・・

環境変数でpathの順番などを気にしないといけないですけど。
(コマンドラインで「java」と打つと、自作の「java.bat」に行くように設定)

だから、自分で環境変数を設定するjava系アプリには利かないかも知れません。
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-09-05 18:28
私と同じ発想ですね。バッチだとコマンドプロンプトが表示されるし、"java.exe"で呼ばれた時まずいので、それはやめました。

最初の説明がわかりにくかったので実際にコードを乗せますと、

なんちゃってjava.exe
コード:
#include <process.h>
#include <vector>

int main(int argc, char* argv[])
{
    char path[] = "java_def.exe";

    std::vector<char*> v;

    v.push_back(path);

    v.push_back("-Dsun.java2d.noddraw=true");

    v.insert(v.end(), argv + 1, argv + argc);

    v.push_back(NULL);

    execvp(path, &v[0]);

    return 0;
}



なんちゃってjavaw.exe
コード:
#include <windows.h>
#include <shellapi.h>
#include <string>

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR command, int)
{
    std::string new_command = "-Dsun.java2d.noddraw=true ";

    new_command += command;

    ::ShellExecute(NULL, NULL, "javaw_def.exe", new_command.c_str(), NULL, SW_SHOWNORMAL);

    return 0;
}



コンパイラはC++Builder5です。

#できればこんなのじゃなく、プロパティファイルとかレジストリとかで設定する方法があればいいのですが・・・
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-09-05 18:33
unibon です。こんにちわ。

引用:

oceanさんの書き込み (2003-09-05 17:12) より:
アプレットとか、人の作ったプログラムとか、すべてに渡したいので・・・・


以下も外しているかもしれませんが、
Java Plug-in で動く Java Applet ならば、
Java Plug-in コントロールパネルで設定できると思います。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/plugin/developer_guide/control_panel.html
#私は、JDK のインストールの際に Java Plug-in は、
#インストールしない(かあとでアンインストールしてしまう)ので、
#あまり使ったことはないのですが。

でも Java Application には効かなさそうですね(これも未確認ですが)。

もし sun.java2d.noddraw=true にしたいだけならば、
Windows の側の設定で DirectDraw を無効にしてしまう手も考えられます(dxdiag.exe などで)が、
副作用が大きいですね。
ウラタン
常連さん
会議室デビュー日: 2003/07/25
投稿数: 29
投稿日時: 2003-09-05 18:38
お疲れさまです。
こちらこそすいません、ちゃんと読み取れていませんでした。

よし、なら、「java.exe.bat」を作ればいいですね。(いい加減怒られそう)

VMのデフォルト設定値みたいなノリで解決できるんですかねえ?
もしできれば自分も知りたいです。

というワケでお手上げです。
詳しい方、どなたかよろしくお願いいたします(弱)

ではでは。
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-09-05 19:11
こんにちは。

引用:

以下も外しているかもしれませんが、
Java Plug-in で動く Java Applet ならば、
Java Plug-in コントロールパネルで設定できると思います。



これは、以前試してだめだったと思います。アプリケーションに反映されなかったし、なにより、このコントロールパネルを開くと、スタートボタンのあるバーが無反応になったのです。

#JREとJDKが共存していたので、どちらが呼ばれていたのかはっきりしませんが・・・

DirectX自体を切るのは、最終手段としたいと思います。


[ メッセージ編集済み 編集者: ocean 編集日時 2003-09-05 19:19 ]

スキルアップ/キャリアアップ(JOB@IT)