Apache pig Aspectj中的重复条目

Apache pig Aspectj中的重复条目,apache-pig,aspectj,Apache Pig,Aspectj,当我尝试使用Aspectj代码编织jar文件时,我得到了 java.util.zip.ZipException: duplicate entry org/apache/pig/backend/hadoop/execu tionengine/physicalLayer/expressionOperators/Add.class 我使用以下命令来编织jar文件 ajc -inpath C:\pig.jar -aspectpath C:\Aspects.jar -extdirs C:\lib

当我尝试使用Aspectj代码编织jar文件时,我得到了

    java.util.zip.ZipException: duplicate entry org/apache/pig/backend/hadoop/execu
tionengine/physicalLayer/expressionOperators/Add.class
我使用以下命令来编织jar文件

ajc -inpath C:\pig.jar -aspectpath C:\Aspects.jar -extdirs C:\libs -outjar C:\pig\pig.jar
有人能告诉我为什么吗

首先,ajc不知道任何-extdirs参数,AFAIK。 我还觉得很奇怪,您的outjar与injar同名,只是在另一个子目录中。这使得在下一次编织或仅仅使用库时很容易将一个错误与另一个错误混淆。 重复条目可能来自pig.jar和Aspects.jar中包含的同一个类。这可能是一个错误的猜测,见下面评论部分安迪·克莱门特和我之间的讨论。更新2中描述了真正的原因。 更新:

那么,您提到的异常是如何在打包outjar时发生的呢

导入java.io.FileOutputStream; 导入java.io.IOException; 导入java.util.jar.JarOutputStream; 导入java.util.zip.ZipEntry; 公共类ZipExceptionDemo{ 公共静态无效主字符串[]args引发IOException{ 尝试JarOutputStream=new JarOutputStreamnew FileOutputStreamfoo.jar{ stream.putnextrynew-ZipEntrycom/foo/One.class; stream.putnextrynew-ZipEntrycom/foo/Two.class; stream.putnextrynew-ZipEntrycom/foo/UhOh.class; stream.putnextrynew-ZipEntrycom/foo/UhOh.class;//uh-oh! } } } 线程主java.util.zip.ZipException中的异常:重复条目:com/foo/UhOh.class 位于java.util.zip.ZipoutStream.PutnextryZipoutStream.java:215 位于java.util.jar.JarOutputStream.putnextryjaroutputstream.java:109 在ZipExceptionDemo.mainZipExceptionDemo.java:12 现在,您的工作是找出为什么要将同一个类放在多个罐子中,并将其混合到一个罐子中。您甚至知道要搜索哪一个:org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.Add

更新2:


我已经能够通过inpath上包含相同类文件的两个jar或目录重现这个问题。如果您的命令行在inpath上只有一个条目(如您的问题中所示),那么您是如何获得该错误的,这对我来说仍然是个谜。无论如何,我已经为这个问题提交了一份申请。

AspectJ的版本是什么?请注意我的更新答案。aspectpath实际上只是用于“参考”,在上面找到的内容没有复制到outjar。如果你想把它们放在outjar中,你应该把这些文件放在inpath上。你确定吗?Ajc在那里找到了我的相位,它们是编织的。不管怎样,我重现的问题是关于inpath的。aspectpath是一个查找方面的地方,可以将其应用于通过流程源代码或来自inpath的类文件的任何代码-这是方面库应该去的地方。但是,这条路径上的东西不应该进入outjar,我不认为这可能是一个bug,如果它这样做的话,你是对的,像往常一样。我测试了Eclipse自动构建的东西,它覆盖了我的命令行内容。好的,如果我想把所有东西都放在一个输出JAR中,那么方面JAR需要在运行时放在类路径上,或者在编译时放在inpath上。哦,是的,我完全同意你的看法,我能想象这种情况发生的唯一方式就是在inpath上有两个条目。我只是对方面路径进行了评论。我可以想象一个jar是以某种奇怪的方式构建的,其中包含两个类文件,显然只有第一个可能被使用,而当outjar构建时,aspectj的输入会让它崩溃。