“jar”命令何时会拒绝将类添加到.jar文件中?

3

我有204个总类(大多数类都是内部类)。几个月来,我一直在使用SCons进行构建(SCons只调用jar命令)。

由于某种原因,它停止为特定类添加最后一个内部类。例如,假设我有以下类:

class1
class2
class3
class4
class5
class6
...
class79
class80

在这最后一次更改之前,SCons可以很好地打jar包。但是现在...它特别不会将class80添加到其jar命令中。(我看到jar命令中省略了class80)。
是否存在jar命令忽略某些类的情况?
-----------编辑。我找到了罪魁祸首。由于某种原因,SCons无法识别此内部类!
vehicleFilter = new RowFilter<Object, Object>(){ 
public boolean include(Entry<? extends Object, ? extends Object> entry)                {                                                 
    {return false;}  
};

我似乎已经找到了问题的原因,但不确定为什么在 SCons/jar 下会出现错误。我正在使用 JTables 并添加 RowFilter……由于某些原因,它似乎不接受行过滤器内部类?但这仍然无法解决我的问题。 - user402642
这是唯一被忽略的匿名类型,还是你拥有的唯一匿名类型? - Tim Stone
嗨Tim。在这204个类中,大约一半是匿名类(class,class$1,class$2等)。我也有一些本地类的混合。 - user402642
3个回答

1

你需要将JAVAVERSION='1.6'作为参数添加到你的env.Java()调用中:

env.Java(target='classes', source='src', JAVAVERSION='1.6')

如果没有这个设置,如果你使用当前版本的 javac 进行编译,SCons 将无法确定匿名内部类的正确名称,因此当这些错误的类文件名传递给 jar 时,它将失败。


jar类文件(在我的使用情况下),SCons似乎无法选择所有具有内部类的类文件(不是匿名内部类)。添加JAVAVERSION对我来说似乎没有解决问题。你有什么想法,我应该做什么? - decimus phostle

0

与其将整个类文件列表传递给Jar命令,您可以传递一个目录。这样可以避免SCons的java解析器出现问题,因为SCons会扫描该目录中的文件并将找到的所有内容打包成jar文件。

类似下面的操作将会将"src"目录中的文件编译到"classes"目录中,然后从"classes"目录的内容创建一个jar文件:

env = Environment(tools=['javac', 'jar'])
env.Java(target='classes', source='src')
env.Jar(target='foo.jar', source=['classes', 'Manifest.txt'],
        JARCHDIR='$SOURCE')

清单文件“Manifest.txt”位于此处您的项目的根目录中。唯一的要求是它以文本“Manifest-Version”开头。


如果混合中有一个Manifest.txt文件,情况就会变得复杂。如果我有了这个清单,并且希望它成为项目的根目录(在src/和classes/之前的dir),我该怎么做呢?如果我们将JARCHDIR设为classes/,SCons会跳过它。 - user402642

0
SCons 可能通过在其上列出所有类以构建命令行,这可能会变得太长(无论是平台限制还是 SCons 内部的启发式算法)。
您需要查看 SCons 包内部以了解其运作情况。
您不使用 ant 的特定原因是什么?

是的...我的项目大部分都是C++,只有这个例外。我个人认为它的限制并不是太长(虽然204已经很大了)。我已经将其缩小到RowFilter类。请查看我的编辑。 - user402642

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