2012-01-24 2 views
2

메이븐 쉐이드 플러그인은 자바 리플렉션의 전형적인 클래스/패키지 이름을 문자열에서 무시합니다. "음영"하려는 라이브러리가 Class.forName ("originalpackagename ....")을 사용하는 경우 원본 패키지 이름이 변경되지 않기 때문에 음영 처리 된 종속성이 작동하지 않습니다. 와 같은 이야기 코드 자바 리플렉션을 다루는 메이븐 쉐이드 플러그인 변압기

servlet.addServletWithMapping("org.mortbay.jetty.servlet.DefaultServlet", 
    URIUtil.SLASH); 

와 설상가상으로

같은 :

private String[] _serverClasses = { 
    "-org.mortbay.jetty.plus.annotation.",  // don't hide 
    "-org.mortbay.jetty.plus.jaas.",    // don't hide 
    "-org.mortbay.jetty.plus.naming.",   // don't hide 
    "-org.mortbay.jetty.plus.jaas.",    // don't hide 
    "-org.mortbay.jetty.servlet.DefaultServlet", // don't hide 
    "org.mortbay.jetty.", 
    "org.slf4j." 
}; 

어쩌면 메이븐 그늘에 이미 일부 ResourceTransformer있다 (예 부두 서버 소스 코드에서 복사) 문자열 소스 코드의 원래 패키지/클래스 이름을 대체합니까?

답변

0

대부분의 경우 이것은 w 암탉이 당신의 질문을했는데 (버전 2.3을 사용하고 있습니다), 그늘 플러그인은 자바 소스 파일의 패키지 이름 리터럴을 자동으로 처리하는 것처럼 보입니다.

그러나 리소스 파일의 경우에는 그렇지 않습니다. 예를 들어, log4j 패키지를 음영 처리 한 다음 log4j.properties에서 로거 구현 클래스를 참조하면 런타임시 예외가 발생합니다. 나는 그늘 플러그인을 위해 특별히 보이지 않지만 third-party maven-replacer-plugin을 사용하여이 문제를 해결했습니다. 예 :

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <version>1.5.3</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>replace</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <basedir>${project.build.directory}</basedir> 
    <includes> 
     <include>classes/*.properties</include> 
    </includes> 
    <replacements> 
     <replacement> 
     <token>org.</token> 
     <value>my-shaded-package-root.org.</value> 
     </replacement> 
    </replacements> 
    </configuration> 
</plugin> 
관련 문제