2014-12-24 5 views
5

나는 내 프로젝트에서 내가 거부 할 수없는 독점 의존성을 가지고있다. 그것은 하나의 큰 뚱뚱한 항아리 안에 내장 된 모든 의존 패키지와 함께 지어졌습니다. 모든 말로하면 slf4j-api, apache-commons, javax 패키지 등과 같은 일반적인 것들도 의미합니다.fat jar dependency를 다루는 방법

선언 된 종속 항목 목록과 함께 사용하면 클래스가로드 될 클래스 로더에 항상 경쟁이 있기 때문에 위험합니다. 첫 번째 - 광산 또는 낡은 클래스의 뚱뚱한 항아리.

이 문제를 해결할 방법이 있습니까? 그런 뚱뚱한 항아리를 어떻게 다뤄야합니까? 의존성 관리를 위해 maven을 사용하고 있습니다.

+1

비난을 사용하여이 라이브러리의 클래스를 인스턴스화하는 공장을 만들 수 있습니다 않습니다 실제로는 이해할 수 없습니다 (공유지 등). 이것은 항상 클래스 로딩 문제를 일으킬 것입니다. 그래서 자립 된 항아리를 유지해야합니다. 그렇지 않으면 당신은 잃어버린 것입니다. ... – khmarbaise

+1

@khmarbaise 오, 나는 그들을 매일 비난하고 있지만 돕지 않습니다. 그들은 패키지 배포에 대해 아무 것도하지 않을 것입니다. 가까운 장래에 확실히 아닙니다. – SimY4

답변

1

다른 방법이 있다고 생각합니다. 나는 그것의 사용자 정의 클래스 로더

URLClassLoader c1 = new URLClassLoader(new Url[] { new URL("file:lib/fatJarDep.jar"}); 

이 라이브러리 항아리를 포장하고 그 사람들이 같은 내용으로 지방 항아리에게 원인이 고립 로더에게

Class.forName("className", true, c1); 
1

내부에 추출 된 모든 종속성 클래스가 jar에 있으면 클래스 로딩에서 해당 종속성 클래스를 제외 할 수 없으므로 프로젝트에서 동일한 종속성이 충돌 할 수 있습니다.

팻 항아리를 편집하고 수동으로 클래스를 제거하여 가벼운 버전으로 만든 다음 repo에 설치하고 pom에서 참조해야합니다.

+1

제 3 자 프로젝트 지원에 대한 책임을지지 않을 것입니다. 이 라이브러리를 사용자 정의 빌드하면 패치 및 새 릴리스를 기본 소스에서 백 포트하는 데 시간이 걸립니다. – SimY4

+1

버전 업데이트시 실행되는 씬 jar를 만드는 간단한 프로 시저를 작성할 수 있습니다. 수동으로 새 항아리 릴리스 pom을 업데이트한다고 가정합니다. 절차는 새 버전을 입력 받아 얇은 항아리를 만들고 POM을 업데이트 할 수 있습니다. – fantarama

+0

간단한 절차를 안내해 줄 수 있습니까? 그것을 창조하는 것에 관하여 몇몇보기 또는 기사를 보여주십시오? – SimY4

2

Maven에서는 POM의 종속성을 정의하는 순서가 중요합니다. 올바른 순서로 나열한 경우 해당 순서대로 병에 추가해야합니다 ( ). 파일에서 더 높은 클래스가 먼저로드됩니다.

여러 개의 병에서 런타임 클래스 경로를 구성하려는 경우 다시 올바른 순서로 병을 배치해야합니다. 당신은 당신이 종속 FO 일부를 제외하거나 당신이 그들에게 자신을 포함 할 경우 지방 항아리의 일부 기능이 작동합니다 알고있는 경우

+0

이렇게해도 문제가 해결되지는 않습니다. 먼저로드 할 클래스에 따라 코드에 이상이나이 라이브러리의 코드가 표시됩니다. prossible 클래스 비 호환성 때문에. (뚱뚱한 병 안에있는 라이브러리의 버전을 알 수 없음) – SimY4

1

, 당신이 시도 할 수 있습니다 :

  1. 가에 의존하는 Maven 프로젝트를 확인 fat jar only
  2. maven-shade-plugin을 사용하십시오. 특히 원하지 않는 패키지를 제외 시키거나 모든 jar의 클래스를 다른 패키지로 재배치하여 멀리 옮길 수 있습니다.
  3. 다른 프로젝트에서 fat propietary jar 대신 프로젝트의 이슈를 사용하십시오.
+0

제안 해 주셔서 감사합니다. 나는 maven shade plugin에 대해 몰랐다. 나는 그것을 시도 할 것이다. – SimY4