2012-01-24 3 views
8

개미를 사용하여 Java jar 파일을 작성합니다. "zipfileset src ="xxx.jar ""zipfileset src = "yyy.jar"를 사용하여 추가 jar를 포함해야하며 xxx.jar와 yyy.jar는 SAME 정규화 된 클래스 이름을 가진 클래스를 갖습니다. 결과 jar 파일에 중복 클래스 이름이 있습니다. 복제본의 잠재적 영향은 무엇입니까?java jar에서 중복 클래스가 갖는 영향은 무엇입니까?

감사합니다.

+0

왜 당신이 그렇게하고 싶어 중복 항목을 가지고 불평 signjar 다음을 APK가 있다는 것입니다 ? – Bhushan

답변

15

복제본이 번이면 아무 것도로드되지 않습니다. –

그렇지 않은 경우 클래스로드 순서가 마음에 들지 않으므로 다른 버전이 필요할 수 있습니다.

이며 클래스 경로 항목은 나열된 순서대로 검색됩니다 (this classpath doc). 하지만 이것은 클래스 경로 생성을 완전히 제어하는 ​​경우에만 관련이 있습니다 (예를 들어 웹 앱과는 달리).

나는 데이브 동의

+0

예, 정확히 중복 된 구현이 있습니다. 감사합니다. 알았어. –

0

(클래스 경로 와일드 카드는 비 결정적 순서를 만드는 것이다.주의 할로).

그가 제안하는 함정을 피하기 위해 네임 스페이스로 분리 할 수 ​​있습니까?

4

일반적으로이 상황은 매우 권장되지 않으며 이므로 피해야합니다.

Java의 Jars는 클래스 파일의 컨테이너입니다. java는 클래스 경로를보고 클래스 파일을로드하는 클래스 로더를 사용합니다. 그래서 같은 클래스 x.y.Foo를 가진 2 개의 jar 파일 인 A.jar와 B.jar 파일을 가지고 있다면, classpath에있는 jar 파일의 클래스가로드 될 것입니다. 클래스 경로가 A.jar이면 B.jar (이 순서대로) A.jar의 Foo 클래스가 런타임에 사용됩니다. 이 불일치로 인해 내 경험에서 버그 수정이 어려울 수 있습니다.

+0

. "src"대신 zipfileset에 "dir"속성을 포함하도록 ant 빌드 파일을 변경합니다. –

1

whats mean duplicated? 같은 패키지에 같은 이름을 가진 2 개의 클래스를 가질 수는 없지만 (프로젝트가 컴파일되지 않더라도), "ok"인 다른 패키지에 같은 이름의 클래스가 2 개 있다는 것을 의미하는 경우입니다.

+0

별도로 사용되는 2 개의 jar : xxx.jar 및 yyy.jar이 있습니다. 그들은 부분적으로 정확한 구현을 공유하고 있습니다. 또한이 2 병을 포함하는 다른 항아리를 만들고 있습니다. 따라서 결과 jar 파일을 열면 같은 패키지에 중복 된 클래스 이름이 표시됩니다. –

+0

질문, 두 클래스 모두 동일한 기능을 갖고 있습니까? 사실이라면 하나의 jar 만 가리키고이를 피할 수 있습니다. 예 : yyy.jar (클래스를 제거하고 xxx.jar {keep class} 사용) – elopez

0

내가 여기에 설명이 표시되지 않는 또 다른 대답은 당신이 당신의 항아리, Aars의 서명 할 계획이라면, 당신은

jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: com/foo/bar/baz.java 
관련 문제