2016-10-24 6 views
1

나는 <path-to-file>${project.basedir}에 파일의 상대 경로입니다 자원 필터링, 동안 라인맞춤형 MavenResourcesFiltering을 구현하기가 어렵습니까?

// @sourceURL=<path-to-file> 

앞에 추가하기 위해, 일부 소스 파일에 대한 사용자 정의 자원 필터를 작성하고 싶습니다.

나는 인터페이스 MavenResourcesFiltering의 사용자 지정 구현을 작성해야한다고 Maven Custom resources filters 설명서를 따랐다.

MavenResourcesFiltering 구현을 처음부터 작성하는 것이 쉬운 일이 아니라고 생각한 후에 org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering을 살펴 보았습니다. 그래서 나는 DefaultMavenResourcesFiltering에서 연장 할 방법을 찾고 있었고 실제 행의 선을 사용하는 사용자 정의 MavenFileFilter을 제공해야합니다.

@Requirement 
private MavenFileFilter mavenFileFilter; 

을 아마이 :

은 이제 더 위해, DefaultMavenResourcesFiltering의 전체 소스 코드를 복사하는 것보다 다른이를 수행하는 방법 MavenFileFilter 자사 @Requirement 주석을 재정의 할 수 있도록이 없다는 것을 나에게 발생 아마도 Plexus Component Descriptor을 사용하여 Plexus DI container의 구성으로 내 목표를 달성 할 수있는 방법 일 수 있습니다. 아아 약간 외래종인가, 아마도 누군가 비슷한 문제에 대한 좋은 예를 알고 있을까?

답변

1

는 아마 아마 신경총 구성 요소 설명자

의 수단 예, 방법이에 의해 신경총 DI 컨테이너의 구성에 따라 내 목표를 달성 할 수있는 방법이 있습니다. DefaultMavenResourcesFiltering에 사용되는 "default"MavenFileFilter 구성 요소를 무시하고 직접 제공해야합니다. 쉽게 수행 할 수 있습니다. MavenFileFilter 역할을 위해 자신의 Plexus 구성 요소를 만들고 "default" 힌트를 덮어 쓰고 Resources Plugin의 종속성으로 추가하기 만하면됩니다. 클래스가 직접적으로 플러그인 종속물 are loaded first 아래에 있기 때문에 기본 클래스보다 우선 적용됩니다.

설정은 다음과 같습니다. 다음 POM 갖는 새로운 Maven 프로젝트를 만듭니다 있도록 이것은 Maven Filtering 공유 구성 요소에 종속

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.groupId</groupId> 
    <artifactId>my-file-filter</artifactId> 
    <version>0.0.1</version> 
    <dependencies> 
    <dependency> 
     <groupId>org.apache.maven.shared</groupId> 
     <artifactId>maven-filtering</artifactId> 
     <version>3.1.1</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.plexus</groupId> 
     <artifactId>plexus-component-metadata</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>generate-metadata</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

을 자동으로 신경총 component.xml을 생성하기 위해 plexus-component-metadata 플러그인을 선언 (우리의 수업은 제대로 신경총로 등록 구성 요소).

그런 다음, 사용자 정의 파일 필터는 간단하다 : DefaultMavenFileFilter 인 디폴트 하나에서 상속 할 수 있습니다 :

@Component(role = MavenFileFilter.class, hint = "default") 
public class MyMavenFileFilter extends DefaultMavenFileFilter { 

    public void copyFile(File from, File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers, String encoding, boolean overwrite) throws MavenFilteringException { 
     super.copyFile(from, to, filtering, filterWrappers, encoding, overwrite); 
     // your logic of modifying the "to" file here 
    } 

} 

이 단순히 다른 모든 방법은 호출 끝낸다 copyFile 메소드를 오버라이드 (override), 차종 super 메소드를 호출하고 사용자 정의 코드를 수행하여 기본 비헤이비어가 계속 발생하는지 확인하십시오. 이 부분에서는 to 파일을 처리하고 원하는 행을 선행 처리 할 수 ​​있습니다.이 Maven 프로젝트는 mvn clean install로 설치되면

, 당신이 가진 자원 플러그인에 depenndecy로 추가 할 수 있습니다 :

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>3.0.1</version> 
    <dependencies> 
    <dependency> 
     <groupId>my.groupId</groupId> 
     <artifactId>my-file-filter</artifactId> 
     <version>0.0.1</version> 
    </dependency> 
    </dependencies> 
</plugin> 

그것은 DefaultMavenResourcesFiltering 내부에 주입됩니다 사용자 정의 파일 필터입니다.

+0

Thx, 참조를 위해 https://github.com/aperto/sourceurl-resourcefilter를 참조하십시오. 나는 당신의 솔루션을보기 전에 끝냈습니다. 그래서'mavenFilteringHint'를 사용하지 않고'DefaultMavenFileFilter'의 코드 복사 및 붙여 넣기를 오버라이드하는 대신에 타겟 파일에 두 번 쓰면 라인을 따라 더 단순화 될 수 있습니다. 제안했다. – jfrantzius