1

私はJavaにまったく慣れておらず、クラスパスの設定にいくつか疑問があります。このフォーラムで質問する前に、宿題をしました。グーグルを試し、他のフォーラムを参照しましたが、探しているものが見つかりませんでした。

だから、ここに行きます。

  1. 正しく実行するために外部jarを必要とするJavaアプリケーションを開発しています。
  2. これらの外部jarは、カスタムアプリケーション「XYZ」がシステムにインストールされている場合にのみ使用できます。
  3. ライセンスの問題のため、XYZアプリケーションjarをアプリケーションにパックしたくありません。
  4. 私のアプリケーションは、アプリケーションXYZが宛先ホストに存在するかどうかを確認し、使用可能な場合は実行します。それ以外の場合は、プログラムを実行して終了するためにXYZが必要であることを示すエラーをログに記録します。

今、主要な部分が来ます...

  1. XYZアプリケーションは、Linux / Windows /Solarisなどのさまざまなプラットフォームで利用できます。
  2. XYZは、インストール中にカスタマイズして、カスタムディレクトリにインストールできます。たとえば、WindowsではD:/ XYZ、またはD:/ apps / XYZ、Linux、solarisなどでは/ apps/XYZまたは/apps/ admin/XYZです。
  3. XYZアプリケーションをインストールすると、jarファイルはXYZがインストールされたディレクトリ/jarsに存在します。例-*nixのD:/ XYZ / jars、/ apps / XYZ/jars。
  4. アプリケーションXYZが任意のプラットフォームにインストールされると、新しい環境変数XYZ_LIB_PATHが作成され、jarが存在するそれぞれのフォルダーを指します。たとえば、アプリケーションXYZがDにインストールされると、XYZ_LIB_PATH = D:/ XYZ/jarsが作成されます。 /XYZ。同様に、アプリケーションXYZがLinuxマシンにインストールされている場合、XYZ_LIB_PATH = / apps / XYZ/jarsが作成されます。

今私がやりたいのは..

アプリケーションで環境変数(XYZ_LIB_PATH)を参照し、プラットフォームのXYZ_LIB_PATH環境変数が指すディレクトリにあるすべてのjarファイルを取得します。これにより、アプリケーションのインストール時に各マシンでjarファイルを探す必要がなくなります。XYZ_LIB_PATH変数が指すディレクトリを調べて、必要なjarをロードすることで実行を続行できます。

この背後にある理由は、アプリケーションXYZはカスタマイズ可能であるため、各ユーザーが異なるディレクトリにインストールしている可能性があり、私のアプリケーションはXYZがインストールされている場所を見つける必要があります。代わりに、環境変数を使用すると、XYZ_LIB_PATH変数に設定されたパスを調べることで、アプリケーションに必要なjarを簡単に取得できます。ユーザーは環境変数を変更できないため、この変数はすべてのプラットフォームで一定のままであり、jarの有効なパスを取得できます。

Javaでこれを達成する方法はありますか?

ありがとう、Vinay S

4

2 に答える 2

1

アプリの起動スクリプトを提供するだけです。

java -cp myApp.jar;%XYZ_LIB_PATH%\* com.foo.bar.MyApp

(上記の例はWindows用です。同じことがUnixでも実行できます)。

必要に応じて、このスクリプトはXYZ_LIB_PATH環境変数が設定されているかどうかを検出し、設定されていない場合は正常に終了します。

IF NOT DEFINED XYZ_LIB_PATH (ECHO XYZ is NOT installed)
于 2012-07-22T14:37:48.050 に答える
1

Google で見つけたこのコードを見てください。jar を動的にロードする方法が説明されているはずです。

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author Thomas.Darimont
 */
public class DynamicClasspathExtensionExample {

  /**
   * @param args
   */
  public static void main(String[] args) {
    try {
      Class.forName("com.google.inject.Injector");
      System.out.println("Found");
    } catch (ClassNotFoundException e) {
     System.out.println(e.getMessage() + " not found...");
    }
    addJarsToClassPath(Thread.currentThread().getContextClassLoader(), new File[]{new File("D:/stuff/google/guice/1.0/guice-1.0.jar")});
    try {
      Class.forName("com.google.inject.Injector");
      System.out.println("Found");
    } catch (ClassNotFoundException e) {
      System.out.println(e.getMessage() + " not found...");
    }
  }

  private static void addJarsToClassPath(File... jars) {
     addJarsToClassPath(Thread.currentThread().getContextClassLoader(), jars);
  }

  private static void addJarsToClassPath(ClassLoader classLoader, File... jars) {
    if (classLoader instanceof URLClassLoader) {
      try {
        Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });
        addUrlMethod.setAccessible(true);
        if (null != addUrlMethod) {
          for (File jar : jars) {
            try {
              addUrlMethod.invoke(classLoader, jar.toURI().toURL());
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

    }
  }
}

編集:したがって、jarを次のようにロードできます:

addJarsToClassPath(Thread.currentThread().getContextClassLoader(), new File(System.getenv("XYZ_LIB_PATH"), "library.jar"));
于 2012-07-22T14:31:55.120 に答える