2014-11-07 2 views
0

Когда я пытаюсь соткать .jar файл с помощью AspectJ код, я получаюДублировать запись в AspectJ

java.util.zip.ZipException: duplicate entry org/apache/pig/backend/hadoop/execu 
tionengine/physicalLayer/expressionOperators/Add.class 

Я использовал следующую команду, чтобы соткать файл фляги

ajc -inpath C:\pig.jar -aspectpath C:\Aspects.jar -extdirs C:\libs -outjar C:\pig\pig.jar 

Может ли одно сказать меня почему?

+0

Какая версия AspectJ? –

+0

версия 1.8.2. – user3797438

+0

Обратите внимание на мой обновленный ответ. – kriegaex

ответ

0
  • Ну, в первую очередь AJC не знает ни одного -extdirs В параметре, AFAIK.
  • Я также считаю довольно странным, что ваш прилив имеет то же имя, что и injar, только в другом подкаталоге. Это позволяет легко ошибочно принимать одно за другим при ткачестве в следующий раз или просто используя библиотеку.
  • «Дубликат запись», что, возможно, происходит от того же класса, которая содержится в pig.jar и Aspects.jar. «Возможно» было неправильной догадкой, см. Обсуждение между Энди Клементом и мной в разделе комментариев ниже. Истинная причина описана в обновлении 2.


Update:

Так как это может случиться, что исключение вы упоминаете происходит во время упаковки outjar?

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.jar.JarOutputStream; 
import java.util.zip.ZipEntry; 

public class ZipExceptionDemo { 
    public static void main(String[] args) throws IOException { 
     try (JarOutputStream stream = new JarOutputStream(new FileOutputStream("foo.jar"))) { 
      stream.putNextEntry(new ZipEntry("com/foo/One.class")); 
      stream.putNextEntry(new ZipEntry("com/foo/Two.class")); 
      stream.putNextEntry(new ZipEntry("com/foo/UhOh.class")); 
      stream.putNextEntry(new ZipEntry("com/foo/UhOh.class")); // uh-oh! 
     } 
    } 
} 
Exception in thread "main" java.util.zip.ZipException: duplicate entry: com/foo/UhOh.class 
    at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:215) 
    at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:109) 
    at ZipExceptionDemo.main(ZipExceptionDemo.java:12) 

Теперь ваша задача выяснить, почему у вас есть один и тот же класс в нескольких JAR-файлы, которые вы хотите смешать в одну. Вы даже знаете, какой из них искать: org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.Add.


Update 2:

Я был в состоянии воспроизвести проблему с двумя кувшинов или каталогов на inpath, содержащего тот же файл класса. Как вы могли получить эту ошибку, если в вашей командной строке действительно есть только одна запись на inpath, как показано в вашем вопросе, остается для меня загадкой. Во всяком случае, я зарегистрировал bug ticket для проблемы.

+0

aspectpath на самом деле просто используется «для справки», и содержимое, найденное на нем, не копируется в outjar. Если бы вы хотели, чтобы они были в развязке, вы бы поместили эти файлы в inpath. –

+0

Вы уверены? * Ajc * находит мои аспекты там, и они сплетены. Во всяком случае, проблема, которую я воспроизвела, в любом случае касалась * inpath *. – kriegaex

+0

aspectpath - это место, где нужно искать аспекты для применения к любому коду, проходящему через процесс (исходный код или файлы классов из inpath) - именно там должны идти библиотеки аспектов. Но материал с этого пути не должен идти в форвард, я не верю (это, вероятно, ошибка, если он это делает) –

Смежные вопросы