2011-09-19 5 views
7

속성 자리 표시자를 확인해야하는 XML 파일 (urlrewrite.xml)이 있습니다. 이를 달성하기 위해 Maven 필터링을 활성화합니다. 이것은 조립 된 WAR 파일에서 잘 작동합니다. 실행 : 받는다는 부두로 받는다는 - 부두 - 플러그인 (메이븐 부두 플러그인)를 사용하여 개발 모드에서 응용 프로그램을 실행하려고 할 때Maven Jetty Plugin을 사용할 때 리소스를 필터링하는 방법은 무엇입니까?

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 

문제입니다.

해당 파일 urlrewrite.xml은 src/main/resources 디렉토리에 있으므로/WEB-INF/classes (또는 maven jetty : run의 대상/클래스)에서 끝나야합니다.). 다음과 같이

URLRewriteFilter의 설정은 설정 파일의 위치를 ​​지정 :이 배치시 작동

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    <init-param> 
     <param-name>confPath</param-name> 
     <param-value>/WEB-INF/classes/urlrewrite.xml</param-value> 
    </init-param> 
</filter> 

. 그러나 Jetty Maven 플러그인을 사용하면 config.loadResourceAsString ("/ WEB-INF/classes/urlrewrite.xml")을 사용하여 구성 파일을로드하기 때문에 URLRewrite가 NullPointerException으로 종료됩니다. Jetty는 작업 영역에서 애플리케이션을 실행할 때/WEB-INF/classes/...를 src/main/webapp/WEB-INF/...로 해석하기 때문에 null을 반환합니다. WAR 파일이 아직 어셈블되지 않았기 때문에 파일이 존재하지 않습니다. 대신 target/classes/urlrewrite.xml에서 자원을 가져와야합니다.

그게 불분명하다면이 질문에 답할 수 없을 것입니다. 나는 당신이 문제 해결법을 알아 내기 위해 부두 전문가가되어야 할 것 같아서 (힌트 : 그것은 도전입니다!).

누구든지이 문제를 해결할 방법을 알고 있습니까? 새로운 디렉토리 아래

  1. 을 넣어 urlrewrite.xml, SRC/메인/webResources과 받는다는 전쟁 플러그인에 <webReources>를 추가하고 필터링을 사용 : 나는 또한 소용이 알고 다음과 같은 대안을 시도했다. WAR를 패키지로 만들었을 때 적절한 위치에 내용을 복사하지만 부티크에서는 사용할 수 없습니다. run
  2. 내가 기억하지 못하는 다른 몇 가지 해킹 ... (내가 할 경우 업데이트됩니다)
요약

은 받는다는 - 부두 - 플러그인은 받는다는 부두에 사용할 수하기 위해 SRC/메인/자원/웹 애플리케이션/삽입 경로와 파일 이름 아래로 파일을 필요로 ... 실행 명령

감사합니다.

감사합니다. 로이드 F orce

답변

12

내 질문에 답했습니다. 적어도 6.1.12

    1. 업그레이드 받는다는 - 부두 - 플러그인 ('여러 웹 애플리케이션 소스 디렉토리 구성'에이 위키 페이지를 참조하십시오 사용할 수 이후 부두 - 6.1.12.rc2 및 부두 - 7.0 .0pre3)

    2. 일부 마법을 추가합니다.XML : 필터링 된 웹 자원에 대한

    첫째, 새로운 디렉토리를 추가 (SRC/메인/webResources)과는 < 자원 > 요소 추가 :

     <resource> 
          <directory>src/main/webResources</directory> 
          <filtering>true</filtering> 
          <targetPath>../jettyFilteredResources</targetPath> 
         </resource> 
    

    대상으로 파일을 복사합니다/jettyFilteredResources (우리는 이것을 나중에 참조 할 것이다). 이 디렉터리는 패키지화 된 WAR 파일로 복사되지 않으며 부두 전용입니다. 모든 것이 실제 WAR 파일을 패키지화되어 있는지 확인합니다

       <webResources> 
            <resource> 
             <directory>src/main/webResources</directory> 
             <filtering>true</filtering> 
            </resource> 
           </webResources> 
    

    :

    은 받는다는 전쟁 - 플러그인 < 구성 > 요소에 다음 요소를 추가합니다.

    마지막으로, <baseResource> 요소에 추가 한 다음 코드에 의해, 특히 그것을 복사 한 자원을 사용하는 부두 말 : 이제 모든

    <baseResource implementation="org.mortbay.resource.ResourceCollection">       
        <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV> 
    </baseResource> 
    

    역사하시는 것입니다! (글쎄, 기술적으로 아직 생산 WAR를 테스트하지는 못했지만 ... 그래도 작동해야합니다.)

    누군가가 더 좋은 답변을 갖고 있다면 합리적인 시간 (예 : 1 일) 내에 답변을 제공한다면 동의 할 것입니다.

  • +0

    +1 문서 작성 솔루션의 경우 (그물에 너무 많은 답변이 없습니다). 이 방법이 효과가 있다면 스스로 받아들입니다. 그냥 제쳐두고, 당신은 '개발'메이븐 프로필을 전문 자원 필터링과 함께 추가하려고 했습니까? 그것이 비 분사 (non-jetty) 웹 프로젝트를 위해 취한 접근 방식이었습니다. –

    +0

    선택적으로 maven-replacer-plugin을 사용하여 바뀐 파일을/WEB-INF/classes/dir에 씁니다. dir 구조가 있는지 확인합니다. – Steven

    +0

    Jetty 9를 사용하는 경우 : org.mecolipse.jetty.util.resource.ResourceCollection 대신 org.mortbay.resource.ResourceCollection을 사용하십시오. – RockMeetHardplace

    3

    나는이 다른 문제의 대답은 더 생각 :

    Running resource filters when using jetty:run

    기본적으로, 대신 'MVN 부두 : 실행'을 실행하는 당신이 사용해야하는 'MVN 부두 : 실행 - 폭발'.

    유일한 단점은 WAR 파일을 빌드해야하는 경우 일 수 있으며, 경우에 따라 비용이 많이들 수도 있습니다. 그것이 당신에게 문제가되지 않는다면, 나는 그것이 더 나은 것 같아요.

    <resources> 
         <resource> 
          <directory>src/main/webapp/WEB-INF</directory> 
          <filtering>true</filtering> 
          <targetPath>../jettyFilteredResources</targetPath> 
         </resource> 
        </resources> 
    

    을하고이 같이 방법을 내장 제티 서버입니다 :

    +0

    run-exploded는 옵션이 아닙니다. 몇 분 대 몇 분 얘기하는 것; 적어도이 게시물이 쓰여진 당시의 경우였습니다.위에 게시 한 솔루션을 통해 두 가지 장점을 모두 누릴 수 있습니다. 예, 해킹입니다. 하지만 실제 응용 프로그램으로 전혀 흘리지는 않습니다. 일단 설치되면 잊어 버릴 수있는 빌드 해킹 일뿐입니다. 그에게 총을 쥐고 당신이 생각하는 것을 알려주십시오. 나는 경험있는 maven 사용자를 위해 글을 쓸 때 내 대답이 약간 간결하다는 것을 인정한다. 그것이 도움이된다고 생각한다면 나는 더 자세한 내용으로 업데이트 할 수있다. – les2

    +0

    내가 뭔가를 놓치지 않는 한,이 대답은 나를 위해 일했습니다. – jbird

    2

    은 pom.xml 파일이 추가

     <plugin> 
          <groupId>org.eclipse.jetty</groupId> 
          <artifactId>jetty-maven-plugin</artifactId> 
          <version>9.1.3.v20140225</version> 
          <configuration> 
           <webAppConfig> 
            <descriptor>target/jettyFilteredResources/web.xml</descriptor> 
           </webAppConfig> 
           <scanIntervalSeconds>3</scanIntervalSeconds> 
          </configuration> 
         </plugin> 
    

    woila! 감사합니다. @ les2 영감을 받으세요 ;-)

    +0

    jetty-maven-plugin을 위해이 기능을 직접 구현해야합니까? 그렇다면 정말 대단합니다. 확실히 필요한 구성을 훨씬 단순하게 만듭니다. – les2

    0

    다른 방법을 찾았습니다.

    프로젝트를 빌드하고 대상 폴더를 추가 클래스 경로로 추가하십시오.

    <webAppConfig> 
        .... 
        <extraClasspath>${basedir}/target/mywebapp</extraClasspath> 
        .... 
    </webAppConfig> 
    
    관련 문제