即使它们存在,javac也找不到.jar中的类?

4

我在编译过程中包含了一个相当大的JAR文件,该文件是使用Altova MapForce生成的。这个JAR文件大约有65MB大小,编译一直正常进行。后来我需要添加更多的映射,于是我重新生成了JAR,并尝试再次构建。现在的JAR文件大小已经达到了80MB。

现在,尽管我已经打开了JAR文件并验证了符号是否存在,但我仍然遇到各种“找不到符号”的错误消息!我是否达到了JAR大小的上限?在JAR文件中有超过75,000个类。

奇怪的是,当使用Eclipse自动补全时,新的JAR文件可以正常工作,只有在构建时才会出现这些错误。

如果有任何区别,我正在使用Ant。

谢谢,

Brian

编辑:还有另一件奇怪的事情:我打开了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打开详细输出以验证您的类路径是否正确... - Paul Sanwald
你是不是删除了一些输出,还是真的生成了一个名为*************************的类? - Perception
1
为了保护无辜者,它已被涂黑。 - Brian Schrameck
我根本不相信javac语句的排序。 - Paul Sanwald
3个回答

0

我在使用Ant和Jenkins进行构建时遇到了同样的问题。 在详细输出中,当出现“无法找到符号”错误时,显示未找到的类正在加载。尝试多次重建,但都没有解决。

最后,我进入了导入未找到类的类,并更改了导入顺序,使得问题类更靠近顶部。这是一个临时解决方法,因为一旦有人在Eclipse中组织了导入,它们将按照Javac无法加载的顺序进行排序。我们可能需要重新命名该类,以便它排在导入的顶部。

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

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


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。一旦您拥有足够的声望,您还可以添加赏金以吸引更多关注此问题的人。 - Benesh
1
同意,修改为答案。 - Scott Button
干得好。有人标记它为不是答案而要删除,但看起来你及时编辑了它,使它免于被我删除。我将其标记为“看起来没问题”。 - ArtOfWarfare

0

看到具体的编译器错误、类路径等信息会很有帮助。如果在Eclipse中可以工作而在Ant中无法工作,那么很可能是一个类路径问题,即你的Ant脚本未设置与Eclipse项目设置相同的类路径。

我曾经处理过一个jar文件大于80MB的项目,没有任何问题,我不认为jar文件中类的数量有上限之类的限制。因此,jar文件的大小和包含的类的数量不太可能是你的问题所在。

你可以尝试编写一个简单的测试主程序,只导入相关的类,并使用仅该jar文件的类路径进行编译。如果该测试不能正常工作,则说明你正在使用的jar文件存在问题。如果测试不能正常工作,则有可能是Ant的问题或类似问题。

你能否发布你的Ant构建目标和Ant的详细输出?


我刚刚编辑了我的问题并添加了更多信息。有什么想法吗?根据javac详细输出,我正在尝试加载的JAR文件存在于类路径上。 - Brian Schrameck
我稍微修改了我的答案,我认为你应该尝试使用命令行编译只有那个jar和一个执行一些导入的主类。下一步是让该类与您的ant构建脚本配合工作。 - Paul Sanwald

0

好的,我解决了这个问题。 我所做的就是重新生成我的JAR文件(我什么也没改!)然后它就工作了。似乎只是个偶然事件。

很抱歉浪费了大家的时间!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接