2010-07-19 1 views
5

maven과 eclipse를 사용하여 응용 프로그램을 빌드하려고합니다. 내 로컬 컴퓨터에있는 타사 항아리에 대한 종속성이 있습니다. 여기 로컬 경로는 클래스 경로에 포함되지 않습니다. ('<scope> system</scope>`)

<dependency> 
    <groupId>sourceforge.net</groupId> 
    <artifactId>zipdiff</artifactId> 
    <version>0.4</version> 
    <scope>system</scope> 
    <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath> 
</dependency> 

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.11</version> 
</dependency> 

내가 MVN 실행 내 pom.xml 파일

입니다 : 내 프로젝트에 대한 전쟁 파일을 생성하여 설치합니다. 그러나 문제는 zipdiff.jar 파일을 web-inf/lib 폴더에 포함시키지 않는다는 것입니다. 다운로드 된 파일 만 포함됩니다. 로컬 시스템의 파일도 복사해야하지만 maven은이를 무시합니다. 왜 maven이 시스템 파일이 포함 된 파일을 내 war 파일에 포함시키지 않는지 알지 못합니다. 이 문제를 어떻게 해결할 수 있는지 알려주십시오. 미리 감사드립니다.

답변

7

"시스템"범위 인 경우, 컨테이너는 인공물을 제공 할 것으로 예상됩니다. maven docs에서 :

이 훨씬 컴파일처럼,하지만 당신은 JDK 또는 컨테이너가 런타임에 의존성을 제공 할 것으로 예상 나타냅니다

를 제공했다. 예를 들어, 자바 엔터프라이즈 에디션에 대한 웹 응용 프로그램을 만들 때, 당신은 서블릿 API에 의존성을 설정합니다 웹 컨테이너가 그 클래스를 제공하기 때문에 범위를 관련 자바 EE API는 을 제공했다. 이 범위는 컴파일시 에만 사용할 수 있으며 클래스 경로를 테스트하며 이행하지 않습니다.

[...]

시스템

당신이 명시 적으로 들어있는 JAR을 제공 에있는 것을 제외하고 제공에이 범위가 유사하다. 이슈는 항상 이며 저장소에서 조회하지 않습니다.

시스템 범위를 사용하면 컨테이너가이 종속성을 제공한다는 것을 전쟁 플러그인에 나타냅니다. 이것이 당신이하고자하는 것이 아니기 때문에, 가장 간단한 해결책은 인벤토리를 로컬 저장소 (repository), 인트라넷상의 자신의 maven 레포 (repository)에 두는 것입니다.

install:install-file 목표는 로컬 저장소에 단일 파일 (POM 없음)을 설치하는 데 사용할 수 있습니다. 이 작업을 수행 한 후 종속성 유형을 "compile"로 변경하고 "systemPath"요소를 제거하십시오.

우리 회사에서는 인트라넷에서 회사 전체 저장소를 관리하기 위해 Nexus을 사용합니다. 자신의 인조 물과 제 3 자의 인공물에 대한 별도의 리포지토리를 보유 할 수 있습니다. Nexus는 프록시로도 작동하여 외부 리포지토리의 아티팩트를 캐싱하여 빌드 속도를 상당히 높입니다. 즉, 다른 저장소에서 사용할 수없는 새로운 종속성을 사용하는 개발자 만 업로드해야합니다. 다른 모든 개발자도 SCM에서 체크 아웃하고 종속성의 위치를 ​​걱정하지 않고 빌드 할 수 있습니다.

+0

넥서스에 대한 1 단지 (넥서스와 웹 프론트 엔드에서 그것을 할 수 있습니다 - 그래서 심지어 지역, 단일 사용자 환경에 넥서스를 권 해드립니다) 라이브러리에 대해 아티팩트를 만들 수있는 조언을 다른 가상 +1 –

0

눈에 띄는 것은 일반적인 유닉스 스타일의 슬래시/경로를 사용하고 있습니다. Windows에서는 경로에 백 슬래시를 사용합니다. 받는다는는 어쩌면 서로에 그 변환을 시도하고 다음과 같이 경로를 입력 할 수있는 경우 나도 몰라 :

C를 : gelcap \ \ lib 디렉토리 \ zipdiff-0.4.jar

+0

NOPS는 차이 – viren

1

시도하십시오 installing the jars to your local repository. 빌드 시간이되면 더 큰 리포지토리에서 로컬 jar와 jar 사이에는 차이가 없어야합니다.

+0

안녕 Allain이하지 않았다 내가 지역 받는다는 저장소에 내 jar 파일을 설치하지만 난 대상 받는다는 실행하면 양식 일식을 설치하지만 여전히 WEB-INF/lib 폴더에 항아리를 복사하지 않았다입니다. 다음 단계를 수행했습니다. 1. 다음 명령을 실행하십시오. mvn install : install-file -DgroupId = sourceforge.net -DartifactId = zipdiff -Dversion = 0.4 -Dfile = C : /gelcap/lib/zipdiff-0.4.jar - Dpackaging = jar -DgeneratePom = true 로컬 메이븐 저장소에 zipdiff jar 파일을 저장할 폴더를 만들었습니다. 그런 다음 eclipse에서 maven : install을 실행하십시오. 여전히 생성 된 전쟁에는 zipdiff.jar 파일이 없습니다. – viren

+0

또한 pom 파일을 변경하고 종속성의 범위를 제거해야합니다. Maven은 리포지터리 (Dependency)를 리포지토리 (Repository)에서 끌어 와서 전쟁에 포함시켜야합니다. – Cliff

+0

그래이 당신은 – viren

-1

이전에 시도한 적이 없으므로 작동하지 않을 수 있습니다. 컴파일 할 범위를 변경할 수 있습니까?

<dependency> 
    <groupId>sourceforge.net</groupId> 
    <artifactId>zipdiff</artifactId> 
    <version>0.4</version> 
    <scope>compile</scope> 
    <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath> 
</dependency> 
+1

안녕하세요 크리스, Allain이 감사를 작동 몰랐 – viren

+0

멋진 위해 컴파일 범위와 시스템 경로를 사용할 수 없습니다 참고 –

6

나는 받는다는 내 전쟁 파일 시스템 범위를 가진 파일을 포함하지 않는 이유가 일어나는 이유 어떤 생각 없어요. 이 문제를 어떻게 해결할 수 있는지 알려주십시오.

이것은 의도적으로 system 범위 지정 종속성을 documented으로 제공해야합니다.

사실, 나는 여러 번 system 범위 종속성을 피해야한다고 (here, here, herehere)를 작성했습니다. 대부분의 시간은 나쁜 습관이고, 사람들은 그들을 학대하고 있으며, 혜택보다 거의 항상 문제를 발생시킵니다.

하면보기의 "공식"점을 원한다면 나를 Dependency Scopes 미니 가이드를 인용 보자 :

  • system :이 종속성 프로젝트의 수명주기의 어떤 단계에서 필요하지만 시스템 -이다 특유한. 이 범위의 사용은 권장하지 않습니다.이 기능은 "고급"기능으로 간주되며 실제 사용의 모든 파급 효과를 이해할 때만 사용해야합니다. 수량화가 실제로 불가능하지는 않더라도 매우 어려울 수 있습니다.이 범위는 정의에 따라 빌드를 비 휴대용으로 렌더링합니다. 특정 가장자리의 경우 필요할 수 있습니다. 시스템 범위에는 로컬 시스템에서이 종속성의 물리적 위치를 가리키는 <systemPath> 요소가 포함됩니다. 따라서 저장소 (repository)가 아닌 지정된 로컬 시스템에 존재할 것으로 예상되는 일부 아티팩트를 참조하는 데 사용됩니다. 그 경로는 기계마다 다를 수 있습니다. systemPath 요소는 경로의 환경 변수 (예 : ${JAVA_HOME})를 참조 할 수 있습니다.

그래서, 대신 system 범위 중 하나를 사용 :

  • install:install-file를 통해 로컬 저장소에 라이브러리를 추가합니다. 이것은 일을 시작하는 빠르고 더러운 방법입니다. 혼자라면 옵션이 될 수도 있지만, 이식성이 없어집니다.
  • Nexus, Archiva 또는 Artifactory와 같은 "엔터프라이즈 저장소"를 설치하고 실행하고 deploy:deploy-file을 통해 라이브러리를 추가하십시오. 이것은 이상 시나리오입니다.
  • this previous answer에 설명 된대로 파일 기반 저장소를 설정하고 거기에 라이브러리를 저장하십시오. 회사 리포지토리가 없지만 팀으로 작업해야하며 이식성을 희생하지 않으려면 이 (가)으로 가장 좋습니다.

system 범위 사용을 중지하십시오.

관련 문제