2011-02-15 3 views
3

Maven의 기본 기능을 자체 구현으로 대체해야하며이를 수행 할 수있는 확실한 방법을 찾고 있습니다.Maven 3에서 Plexus 구성 요소를 대체하십시오.

나는 org.apache.maven.repository.internal.DefaultVersionRangeResolver 확장하고 다음과 같이 component.xml를 사용하여 내 확장 된 구성 요소를 등록 :

<component-set> 
    <components> 
     <component> 
      <role>org.sonatype.aether.impl.VersionRangeResolver</role> 
      <role-hint>default</role-hint> 
      <implementation>com.my.custom.VersionRangeResolver 
      </implementation> 
      <isolated-realm>false</isolated-realm> 
      <requirements> 
       <requirement> 
        <role>org.sonatype.aether.spi.log.Logger</role> 
        <role-hint /> 
        <field-name>logger</field-name> 
       </requirement> 
       <requirement> 
        <role>org.sonatype.aether.spi.log.Logger</role> 
        <role-hint /> 
        <field-name>logger2</field-name> 
       </requirement> 
       <requirement> 
        <role>org.sonatype.aether.impl.MetadataResolver</role> 
        <role-hint /> 
        <field-name>metadataResolver</field-name> 
       </requirement> 
      </requirements> 
     </component> 
    </components> 
</component-set> 

내가 내 로컬 REPO이 포함 된 프로젝트를 설치, 나는 다른 프로젝트의이 같은이를 참조 pom.xml :

<build> 
    <extensions> 
     <extension> 
      <groupId>my.groupId</groupId> 
      <artifactId>maven-version-resolver</artifactId> 
      <version>SNAPSHOT</version> 
     </extension> 
    </extensions> 
</build> 

그러나 내 인공물은 사용되지 않습니다. 내가 빌드 안쪽이 작은 GMaven 그루비 스크립트를 실행하면 :

session.container.getComponentDescriptorList(
    'org.sonatype.aether.impl.VersionRangeResolver' 
).each{ 
    println "Role Hint: ${it.roleHint}, implementation: ${it.implementation}" ; 
} 

그것은 힌트 '기본'과 저 모두 기본 구현과 내 자신의 구현을 모두 보여줍니다. 어떻게 해결할 수 있을까요?

  • components.xml에 추가 매개 변수를 설정해야합니까 (더 높은 우선 순위).
  • 구성 요소를 Maven 플러그인으로 작성해야하며 프로그래밍 방식으로 구성 요소를 적극 등록해야합니까?
  • 이 문제를 다루는 Plexus 설명서가 있습니까?
+0

안녕하세요, Maven 3.3 확장 메커니즘으로 시도해 보셨습니까? 핵심 메커니즘을 확장 할 수도 있습니다. – splatch

+0

@splatch 왜 대답으로 추가하지 않습니까? –

+0

여전히 예상대로 작동하지 않습니다. http://mail-archives.apache.org/mod_mbox/maven-users/201701.mbox/%[email protected].com%3E – splatch

답변

3

이것은 매우 늦은 대답이지만, 메이븐 코어에서 비슷한 문제에 봉착 한 이들에게 도움이되기를 바랍니다.

Maven 3.3.1에서는 프로젝트 루트에 정의되어 있으며 명령 매개 변수 또는 메이븐 설치에 대한 수정이 필요없는 사용자 지정 코어 확장을 사용할 수 있습니다 : https://maven.apache.org/docs/3.3.1/release-notes.html#Core_Extensions.

나는 버전 범위 해상도를 사용자 정의하는 것과 같은 문제를 가지고 있으며 제대로 작동하도록 관리했습니다. 내 첫 작업 구현은 여기에 태그가 붙어 있습니다 : https://github.com/splatch/maven-osgi-resolver/tree/3.3.9-a. 코드를 약간 앞으로 밀어 넣었지만이 태그에는 버전 범위 처리를 사용자 정의하는 데 필요한 모든 것이 있습니다.

일반적으로 악마가 자세하게 앉아 있습니다. 신경총 주석을 사용해야하고 내보내기 패키지에 plexus-components.xml으로 선언해야합니다. 그렇지 않으면 작동하지 않습니다.

3

분명히 문제는 내 구성 요소 정의가 너무 늦게 등록된다는 것입니다. <extension>이 구문 분석 될 때 일반 DefaultVersionRangeResolver이 이미 인스턴스화되었습니다.

  1. $MAVEN_HOME 내부 디렉토리를 만들고/빈/m2.conf

    $ MAVEN_HOME`에이를 등록
  2. 거기 구성 요소를 넣어 :

    이 솔루션은 해킹의 더

    main is org.apache.maven.cli.MavenCli from plexus.core 
    
    set maven.home default ${user.home}/m2 
    
    [plexus.core] 
    load ${maven.home}/ext/*.jar 
    load ${maven.home}/lib/*.jar 
    

    (ext/.*lib/.* 앞에로드 됨)

내 구성 요소는 사이트 차원의 기능을 추가하기위한 것이므로 이제는 이러한 확장을 설치하고 적용하는 플러그인을 만들어야합니다.