2010-03-31 4 views
11

대규모의 진화하는 다중 모듈 메이븐 프로젝트를 개발하는 경우 다른 의존성에 의해 전이되기 때문에 불필요한 폼에 주어진 종속성이 불가피한 것처럼 보입니다. 예를 들어, 원래 C를 포함하고있는 모듈 A를 가지고 있다면 나중에 리팩터링을하고 A가 모듈 B에 의존하게됩니다. 모듈 B는 다시 C에 의존합니다. 충분히 조심하지 않으면 B와 C 모두에서 A의 종속성 목록. 하지만 물론 C를 A의 pom에 넣을 필요는 없습니다. 어쨌든, transitively 포함되어 있기 때문입니다. 그러한 불필요한 종속성을 찾는 도구가 있습니까? Maven 다중 프로젝트에서 불필요한 의존성을 찾는 방법은 무엇입니까?

(이러한 종속성이 실제로 다치게하지 않아,하지만 그들은 실제 모듈 구조를 가릴 수와 치어 적은 물건을 가진이 :-). 당신이 dependency:analyze을 사용할 수 있습니다 어느 정도

답변

12

것이 더 좋습니다,하지만 너무 아니다 도움이됩니다. JBoss Tattletale도 확인하십시오.

얼마 전 나는 더 깊이 분석 할 수 있도록 maven-storyteller-plugin을 시작했으나 프로젝트는 제작/대중의 사용과는 거리가 멀다. storyteller:recount 목표를 사용하여 사용되지 않거나 중복 된 종속성을 분석 할 수 있습니다.

전체 이야기의 문제점은 "사용되지 않는"것들을 결정하는 방법입니다. 분석 할 수있는 것은 인스턴스 참조에 대한 것입니다. 하지만 직접 또는 비 직접적으로 리플렉션을 사용하는 경우에는 작동하지 않습니다.

업데이트 11월 2014

난 그냥 moved my old code of the Storyteller plugin to GitHub했습니다. 내가 그것을 새로 고침하고 다른 사람들에게 유용 할 수 있도록 중앙에 놓을 것입니다.

+0

+1 추가 할 항목이 없습니다. –

1

당신은 이있는 경우 -> B, B -> C을, 다음 등이 리팩토링 -> (B, C)을. 그것이 여전히 B에 대해 컴파일하는 경우라면 , 당신은 매우 당신이 이적을받을 수 있기 때문에 단순히 종속성을 선택하고 싶지 않아요.

A -> (B-1.0, C-1.0), B-1.0 -> C-1.0 인 경우를 생각해보십시오. 모든 것이 동기화되므로 중복을 피하기 위해 C의 의존성이 있습니다. 그런 다음 A를 B-2.0 -> C-2.0으로 업그레이드하십시오. C-1.0 클래스를 원하지만 C-2.0 클래스가 있기 때문에 오류가 발생하기 시작합니다. 이 시나리오에서는 신속하게 조정할 수 있지만 많은 의존성이있을 때는 훨씬 적습니다.

당신은 매우 그것을 명시 적으로 전이 의존성 충돌이있을 때 당신이 이해할 수 있도록 클래스 패스에 C-1.0을 찾을 것으로 예상하고 있다고 의 치어의 정보를 원한다. 다시 말하지만, Maven은 특정 jar의 "가장 가까운"버전이 클래스 경로에서 끝나는 지 확인하는 작업을 수행합니다. 하지만 일이 잘못되면 - 당신은 얻을 수있는 모든 의존성 메타 데이터를 원합니다.

약간 더 실용적인 노트에서, 의존성은 당신이 당신의 pom에서 그것을 제거 할 수 있고 모든 단위/통합/수용 테스트가 여전히 통과 될 때 사용되지 않습니다.;-)

I

+1

> ... 종속성은 사용자가 >에서 제거 할 수있을 때 사용되지 않으며 모든 유닛/통합/수락 테스트가 여전히 통과됩니다 ... 이것은 정확하지만 분석 방법이 없습니다. :) – lexicore

2

personaly는 종속성 트리 (트리 2D)를 조회 시각적 m2eclipse에의 POM 편집기를 사용한다. 그런 다음 필자가 제공하는 (전쟁, 귀) lib 디렉토리를 살펴 봅니다. 그런 다음 M2Eclipse pom dependencies 뷰어에서 여전히 제 3 자에게 가서 종속성을 마우스 오른쪽 단추로 클릭하십시오 (제외는 자동으로 올바른 종속성에 추가됨).

더 골든 규칙, 단순히 몇 가지 기본 팁이 없습니다 :

치어 많은 올바르지 않은 : 제 3 자 libs와 많은 범위를 컴파일 기본에 너무 많은 의존성이 필요에서, 모두 조심스럽게 공예 경우 그들의 pom, 당신은 너무 많은 원치 않는 의존성을 가져서는 안됩니다.

종속성의 이름으로 추측 할 필요가있는 것은 파서, 변환기, 문서 작성기입니다. xalan, xerces, xalan alfred and co. 그들을 제거하고 내부 jdk1.6 파서, 일반적인 아파치 물건을 사용하려고 Log4j도보고 가치가있다.

보기는 정기적으로 LIB 배달 당신은 아래에서 위로, 당신의 공통 모듈로 시작

이동 후 서비스까지 가서 (메이븐의 의존성 해결이 것을 피해야한다) 다른 버전으로 중복 된 라이브러리가없는 경우 모든 모듈의 의존성을 줄이고, 모듈/귀 전쟁에서 시작하려고하지 마십시오. 너무 어려울 것입니다.

귀하의 인도 물이 여전히 시험 중이거나 비교 중이고, 새로운 인도 물과 비교하여 특히 web-inf/lib 디렉토리에서 winmerge/beyoncompare로 사라진 내용)

+0

누군가가 이것에 비틀 거린 경우에 - 조금 더 정교하고 개정하는 지시는 여기있다 http://stackoverflow.com/questions/33907162/systematic-approach-with-maven-to-deal-with-dependency-hell –

관련 문제