使用guava CharMatcher.matchesAnyOf的Java奇怪的编译错误

时间:2013-06-04 13:55:22

标签: java compiler-errors guava

在我的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");

这不是类路径问题,因为需要番石榴14功能的其他线路运行良好。以下行不会产生错误:

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

为什么只是这个符号而不是其他符号的任何想法都没有解决? Linux JDK中的特定错误?在我的类路径中与其他潜在的jar冲突(我们还有很多其他的依赖)?

1 个答案:

答案 0 :(得分:1)

由于您不使用Maven,因此您可能需要手动管理依赖项。在这种情况下,您是否尝试过简单地使用所有依赖项来查找该类所在的jar?

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

如果您的构建过程捆绑包含依赖项的内容,它也很有用,重要的是将它们全部集中在一个位置。

另一个选择是从运行时以编程方式找出类的来源。如果您注释掉有问题的行以便能够编译并且您可以以某种方式运行它(单元测试或其他),您可以使用以下代码找出该类的来源:

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

罪犯可能是一个古老的Google Collections jar,Guava的前身,如果它有CharMatcher(“1.0以来”似乎表明它),或者另一个嵌入Guava类的jar。