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/*

如果你的构建过程捆绑了包含依赖项的东西,它也可以工作,重要的是把它们都放在一个地方。

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

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

违规者可能是一个旧的 Google Collections jar,Guava 的前身,如果有的话CharMatcher(“Since 1.0”似乎表明它),或者另一个嵌入 Guava 类的 jar。

于 2013-06-06T10:57:12.243 回答