1

私の Java プロジェクトには、次のコード行があります。

CharMatcher.JAVA_LETTER_OR_DIGIT.matchesAnyOf("string");

この行は、Eclipse (Windows、Guava 14.0.1、Java 1.6.0_22-b04) で完全に機能します。統合 VM (debian、Guava 14.0.1 Java 1.6.0_22-b04) でコンパイルすると、次のエラーが発生します。

[javac] /opt/quantis/src/Quantis_EJB/ejbModule/internals/QtsSessionManagerBean.java:298: cannot find symbol
[javac] symbol  : method matchesAnyOf(java.lang.String)
[javac] location: class com.google.common.base.CharMatcher
[javac]         CharMatcher.JAVA_LETTER_OR_DIGIT.matchesAnyOf("string");

guava 14 機能を必要とする他の行はうまく機能するため、これはクラスパスの問題ではありません。次の行はエラーを生成しません。

CharMatcher.JAVA_LETTER_OR_DIGIT.matchesNoneOf("string");
Hashing.sha512().newHasher().putString("string");

他のシンボルではなく、このシンボルだけが解決されない理由について何か考えはありますか? Linux JDK の特定のバグ? クラスパス内の他の潜在的な jar と競合していますか (他にも多くの依存関係があります)?

4

1 に答える 1

1

Maven を使用していないため、依存関係を手動で管理している可能性があります。その場合、クラスが存在する jar を見つけるために、すべての依存関係を単純に検索してみましたか?

grep -E com.google.common.base.CharMatcher lib/*

ビルド プロセスが依存関係を含むものをバンドルしている場合にも機能します。重要なのは、それらをすべて 1 か所にまとめることです。

もう1つのオプションは、ランタイムから、プログラムでクラスがどこから来たのかを見つけることです。問題のある行をコメントアウトしてコンパイルできるようにし、何らかの方法 (単体テストなど) で実行できる場合は、次のコードを使用してクラスの起源を見つけることができます。

System.out.println(CharMatcher.class.getProtectionDomain()
        .getCodeSource().getLocation())

違反者は、Guava の前身である古い Google Collections jar CharMatcher(「Since 1.0」がそれを示しているようです)、または Guava クラスを埋め込んだ別の jar である可能性があります。

于 2013-06-06T10:57:12.243 に答える