我在编译过程中包含了一个相当大的JAR文件,我使用Altova MapForce生成这个文件。JAR文件大约有65MB,编译工作正常。我需要添加更多的映射,所以我这样做了,重新生成了我的JAR,并再次尝试构建。JAR现在大约80MB。
现在我得到各种各样的"找不到符号"错误消息,即使我已经打开JAR来验证符号在那里!我是否达到了JAR大小的上限?JAR文件中有超过75,000个类。
奇怪的是Eclipse的自动完成在新JAR中工作得很好;我只在构建时得到这些错误。
如果有区别的话,我使用Ant。
谢谢,布赖恩
EDIT:还有一些奇怪的事情:我打开了javac的详细输出。似乎在加载所有类之前,我就开始得到编译错误:
[javac] [loading commycompanymyproject*************************.class)]
[javac] [loading commycompanymyproject*************************.class)]
[javac] [loading commycompanymyproject*************************.class)]
[javac] [loading commycompanymyproject*************************.class)]
[javac] [loading commycompanymyproject*************************.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 comaltovaTraceProvider.class(comaltova:TraceProvider.class)]
[javac] [loading comaltovaioStringInput.class(comaltovaio:StringInput.class)]
[javac] [loading comaltovaioStringOutput.class(comaltovaio:StringOutput.class)]
查看您得到的特定编译器错误,您的类路径等将会很有帮助。如果它在eclipse中工作而不是在ant中,则可能是类路径问题,即您的ant脚本设置的类路径与eclipse中的项目设置不同。
我在一个项目上工作,有一个大于80MB的jar文件没有问题,我不认为在jar文件中有一个类的数量上限或类似的东西。jar的大小和它包含的类的数量不太可能是您的问题。
您可以尝试编写一个简单的测试主程序,它只导入有问题的类,然后用javac编译它,并且只在类路径上使用该jar。如果这个测试不起作用,你就知道你正在使用的罐子有问题。如果它不起作用,那一定是一个蚂蚁问题或类似的问题。
可以发布您的ant构建目标,以及ant的详细输出吗?
好了,我已经解决了这个问题。我所做的只是重新生成我的JAR(我没有改变任何东西!)并且它工作了。看来这只是个侥幸。
对不起,浪费大家的时间了!我在Jenkins上通过Ant构建时遇到了这个问题。在详细输出中显示错误"Cannot find symbol"后,显示正在加载未找到的类。试过无数次重建,都不开心。
最后,我去导入没有找到的类,并改变了导入的顺序,使问题类更接近顶部。这是一个临时修复,一旦有人在Eclipse中组织导入,它们就会按照Javac无法加载的顺序进行排序。我们可能必须重命名类,以便它排序到导入的顶部。
经过更多的研究,我发现这与Java中的bug 7101822有关,其中类的急于加载可能导致"Cannot find symbol"错误。
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7101822