6

Bob が Tom を使用するような 2 つのクラス (Bob と Tom) があるとしますが、Tom は Bob を必要としません。これらのファイルは両方とも同じディレクトリ構造にあります。

public class Bob {
  public static void main(String[] args) {
    System.out.println(Tom.MESSAGE);
  }
}

public class Tom {
  public static String MESSAGE = "Hello World";
}

通常の方法で Bob をコンパイルしようとするとTom.java、 の依存関係として認識されるため、暗黙的にコンパイルすることもできますBob.java。それはうまくいきます。

しかしここで、Tom を JAR ファイルに入れたいとしましょう。そこで、ビルドTom.javaして結果を JAR ファイル libTom.jar に配置します。を指すクラスパスでコンパイルしlibTom.jarます。残念ながら、コンパイラはTom.javaファイルを認識し、 でクラスを使用するのではなく、ファイルをコンパイルしlibTom.jarます。Tom.javaクラスがクラスパスで見つかった場合、コンパイラに暗黙的な構築をスキップさせる方法はありますか?

私は、この例がかなり不自然であることを認識しています。この問題に関連する、より複雑であまり工夫されていない使用例があることをご安心ください。ありがとう。

4

4 に答える 4

1

クラスパス内の同じパッケージに同じ名前の 2 つのクラスがある場合、Java がコードをコンパイルするときにどちらが選択されるかを予測することは困難です。クラスがソース自体に存在する場合Tom、それは確実に取得されます。

Tomこれを回避する 1 つの方法は、いずれかの を別のパッケージに入れることです。別の方法は、現在のプロジェクトを別のプロジェクトに移動できる場合ですTom。これらのいずれかが実用的でない可能性があることは理解しています。本当に必要な場合は、独自の ClassLoader を作成して試すことができます。参照用にこの質問を参照してください: Jar hell: how to use a classloader to replace one jar library version with another on runtime

于 2012-06-01T20:31:26.437 に答える
1

どうやらこれは不可能のようで、最初から恐れていたことです。

于 2012-06-02T06:17:43.820 に答える
0

はい、クラスの完全な名前を入力することでそれを行うことができます。

System.out.println(the.package.of.external.Tom.MESSAGE);
System.out.println(the.current.package.Tom.MESSAGE);

于 2012-06-01T20:29:22.170 に答える
0

Java ファイルを別々のソース ディレクトリに分割できますか? これは、1 つのソース ディレクトリの内容から jar を構築し、他のすべてのファイル セットをコンパイルするときに他のソース ディレクトリを含めることができるため、理にかなっています。これはEclipseでうまく機能します。さらに良いのは、Eclipse で 2 つのプロジェクトを使用することです。

于 2012-06-01T20:43:48.367 に答える