【问题标题】:javac can't find classes in .jar even though they are present?javac 无法在 .jar 中找到类,即使它们存在?
【发布时间】:2011-10-13 22:05:24
【问题描述】:

我在使用 Altova MapForce 生成的编译过程中包含了一个相当大的 JAR 文件。 JAR 文件大约 65MB,编译工作正常。我需要添加更多映射,所以我这样做了,重新生成了我的 JAR,然后再次尝试构建。 JAR 现在约为 80MB。

现在,即使我打开 JAR 以验证符号是否存在,我也会收到各种“找不到符号”错误消息!我是否达到了 JAR 大小的上限? JAR 文件中有超过 75,000 个类。

奇怪的是 Eclipse 的自动完成功能在新的 JAR 中工作得很好。我只在构建时遇到这些错误。

如果这有什么不同的话,我正在使用 Ant。

谢谢,

布赖恩

编辑:还有一些奇怪的事情:我打开了 javac 的详细输出。似乎我什至在加载所有类之前就开始出现编译错误:

[javac] [loading com\mycompany\myproject\*************************.class)]
[javac] [loading com\mycompany\myproject\*************************.class)]
[javac] [loading com\mycompany\myproject\*************************.class)]
[javac] [loading com\mycompany\myproject\*************************.class)]
[javac] [loading com\mycompany\myproject\*************************.class)]
[javac] C:\Users\*************************.java:38: cannot find symbol
[javac] symbol  : class *************************
[javac] location: package com.mycompany.myproject.*************************
[javac] import com.mycompany.myproject.*************************;
[javac]                                                      ^
[javac] [loading com\altova\TraceProvider.class(com\altova:TraceProvider.class)]
[javac] [loading com\altova\io\StringInput.class(com\altova\io:StringInput.class)]
[javac] [loading com\altova\io\StringOutput.class(com\altova\io:StringOutput.class)]

【问题讨论】:

  • 您还可以使用 ant 打开详细输出以验证您的类路径是否正确....
  • 您是否删除了一些输出,或者是否真的生成了一个名称为 *********************** 的类**?
  • 为了保护无辜者,它被涂掉了。
  • 我根本不相信 javac 语句的顺序。

标签: java ant compilation compiler-errors javac


【解决方案1】:

查看您遇到的特定编译器错误、您的类路径等会很有帮助。如果它在 eclipse 中而不是在 ant 中有效,则可能是类路径问题,即您的 ant 脚本设置不一样类路径,就像您在 Eclipse 中的项目设置一样。

我在一个 jar 文件大于 80MB 的项目上工作没问题,而且我认为 jar 文件中的类数量没有上限或类似的东西。 jar 的大小和它包含的类的数量不太可能是您的问题。

您可以尝试编写一个简单的测试主程序,该程序只导入有问题的类,然后使用 javac 编译,只在您的类路径中使用该 jar。如果该测试不起作用,您就知道您正在使用的 jar 有问题。如果它不起作用,则必须是蚂蚁问题或类似问题。

你能发布你的 ant 构建目标,以及 ant 的详细输出吗?

【讨论】:

  • 我刚刚用更多信息编辑了我的问题。有什么想法吗?根据 javac 详细输出,我尝试从中加载的 JAR 存在于类路径中。
  • 我稍微编辑了我的答案,我认为你应该尝试从命令行编译,只使用那个 jar 和一个执行一些导入的主类。下一步,让该类使用您的 ant 构建脚本。
【解决方案2】:

好吧,我已经解决了这个问题。我所做的只是重新生成我的 JAR(我没有改变任何东西!)并且它起作用了。看来这只是侥幸。

抱歉浪费了大家的时间!

【讨论】:

    【解决方案3】:

    我在 Jenkins 上通过 Ant 构建时遇到了这个问题。 错误后显示未找到的类:“找不到符号”显示在详细输出中。尝试重建无数次,没有喜悦。

    最后,我去了导入未找到的类的类,并更改了导入的顺序,使问题类更接近顶部。这是一个临时修复,一旦有人在 Eclipse 中组织导入,它们就会按照 Javac 无法加载的顺序进行排序。我们可能必须重命名该类,以便它排在导入的顶部。

    经过更多研究,我发现这与 Java 中的错误 7101822 相关,即急切加载类会导致“找不到符号”错误。

    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7101822

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty引起更多的关注。
    • 同意,修改为答案。
    • 修复它做得很好。有人将其标记为不是答案,但您似乎及时对其进行了编辑以将其从我的斧头中保存下来。我将其标记为“看起来不错”。
    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多