2013-06-18 4 views
5

Оригинал сообщения:
Я хочу, чтобы фильтровать дескриптор web.xml развертывания веб-приложения Java 6, который работает на контейнере сервлетов Jetty 8.1, но он не работает до сих пор. Я хочу, чтобы установить другой этап JSF проекта в зависимости от активного профиля Maven:Фильтрация web.xml при использовании плагина причал-maven?

<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>${jsfProjectStage}</param-value> 
</context-param> 

В разделе Профили в pom.xml выглядит следующим образом:

<profiles> 
    <profile> 
     <id>development</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <jsfProjectStage>Development</jsfProjectStage> 
     </properties> 
    </profile> 
    <profile> 
     <id>production</id> 
     <properties> 
      <jsfProjectStage>Production</jsfProjectStage> 
     </properties> 
    </profile> 
</profiles> 

В Интернете вы найдете несколько способов для достижения этой цели , например используя альтернативные файлы web.xml. Но для меня самый очевидный способ, кажется, использует Maven войны-плагин:

<build> 
    <finalName>...</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <webResources> 
        <webResource> 
         <directory>src/main/webapp/WEB-INF</directory> 
         <filtering>true</filtering> 
         <targetPath>WEB-INF</targetPath> 
         <includes> 
          <include>web.xml</include> 
         </includes> 
        </webResource> 
       </webResources> 
      </configuration> 
     </plugin> 

     ... 

    </plugins> 
</build> 

Поскольку вы найдете много ответов или статьи с этого фрагмента кода, я задаюсь вопросом, почему это не работает для меня. Я попытался заменить <webResource> на <resource> (часто нашел его таким образом), и я также попытался добавить <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>, но ничего из этого не работает.

У кого-нибудь есть идея, что здесь отсутствует, чтобы правильно фильтровать web.xml? Или я должен явно указать <filters>?

Благодаря
Sebastian

Обновление:
Благодаря user944849 теперь я знаю, что причина моей не фильтрованной web.xml не Maven войны-плагин, но мола-Maven-плагин, так как я использую mvn jetty:run для запуска (незамонтированного) webapp. Кто-нибудь знает, как принести плагин причал-maven для фильтрации web.xml перед запуском несобранного webapp?

+0

Что ваша команда Maven? В частности, как вы активируете профиль? '' означает «активен, только если другой профиль не активен». – user944849

+0

Я использую Maven изнутри Eclipse, а _Goals_ для моей _Run Configuration_ для сборки разработки установлен на 'clean jetty: run' без явного набора _Profiles_. Цель для сборки сборки установлена ​​на 'clean install' с параметром _Profiles_, установленным в' production'. –

+1

Делает ли производство один фильтр web.xml, как и следовало ожидать? Меня совершенно не удивляет, что 'jetty: run' не работает, поскольку' jetty: run' выполняет _unassembled_ webapp. Фильтрация происходит, когда плагин войны запускается как часть фазы пакета, в котором 'jetty: run' не использует IIRC. Вероятно, вам нужно провести небольшое исследование, чтобы выяснить, как сделать причал для фильтрации. Или вам может понадобиться использовать причал против полностью собранного webapp. – user944849

ответ

5

После выяснить, что проблема была не Maven войны-плагин, но мола-Maven-плагин, я просто должен был изменить команду Maven от mvn clean jetty:run к mvn clean jetty:run-war, чтобы запустить собранное веб-приложение на встроенном причалу в который дескриптор развертывания также фильтруется.

Спасибо за вашу помощь ребята
Sebastian

0

Ваша конфигурация кажется правильной, но по моему опыту вам может понадобиться также <filters> раздел.

Например, мое приложение имеет что-то подобное:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>${maven-war-plugin.version}</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
       <webResources> 
        <resource> 
         <directory>src/main/webapp</directory> 
         <filtering>true</filtering> 
         <includes> 
          <include>**/bm.js</include> 
         </includes> 
        </resource> 
       </webResources> 
       <warName>${war.name}</warName> 
      </configuration> 
     </plugin> 
    </plugins> 
    <filters> 
     <filter>src/main/filters/filter-${target.environment}.properties</filter> 
    </filters> 
</build> 

bm.js файл содержит ссылку на макро ${my.property}, значение которого устанавливается в 2-х различных файлов, filter-dev.properties и filter-qa.properties. У меня есть 2 разных профиля maven (называемые dev и qa) в родительском POM, в котором я определяю свойство target.environment соответственно.

При работе mvn package с указанием профиля, макрос в bm.js будет заменен на правильное значение.

Я не уверен на 100%, что это необходимо для работы с web.xml, но вы можете попробовать.

+0

Как-то не имеет смысла использовать дополнительный файл фильтра, так как новое значение (после замены) происходит из переменной свойств профиля Maven в 'pom.xml'. Тем не менее я попробовал, и он все еще не фильтрует ничего в 'web.xml'. –

0

Просто мои 2 цента:

Использование вводного войны немного хуже, чем при использовании бег, как перспективе войны потребует упаковка - не подходит для разработки. Решение, которое работало для меня, чтобы следовать эти шаги (я могу представить себе более простой, но у нас есть несколько tweeks в мавена и развертывания проекта):

  1. Оставьте WebAPP по умолчанию фильтрация ресурсов, как это и добавить наши собственные, пользовательские фильтрация
  2. точки молов конфигурации для пользовательского DOCROOT (и альтернативного web.xml)
  3. Bind молов подготовить-пакет (Maven 2.2.1+) фаз в качестве последнего этапа до фактической упаковки
  4. После этого, можно просто запустить maven и предоставить свойства в командной строке, st. как: mvn -Djetty=run -Djetty.webcontext=any-web-context -Djetty.port=8180 prepare-package

Config ниже для maven2, но модификация для нового org.eclipse.jetty & maven3 должен быть простым:

<!-- jetty:run --> 
    <profile> 
     <id>jetty-run</id> 
     <activation> 
      <property> 
       <name>jetty</name> 
       <value>run</value> 
      </property> 
     </activation> 
     <properties> 
      <jetty.docroot>${project.build.directory}/jetty-docroot</jetty.docroot> 
     </properties> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-resources-plugin</artifactId> 
        <version>2.4.3</version> 
        <executions> 
         <execution> 
          <id>jetty-docroot</id> 
          <phase>prepare-package</phase> 
          <goals> 
           <goal>copy-resources</goal> 
          </goals> 
          <configuration> 
           <outputDirectory>${jetty.docroot}</outputDirectory> 
           <resources> 
            <resource> 
             <directory>${basedir}/src/main/webapp</directory> 
             <filtering>true</filtering> 
            </resource> 
           </resources> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
       <plugin> 
        <!-- for maven2, use org.eclipse.jetty for maven3 + slightly different configuration --> 
        <groupId>org.mortbay.jetty</groupId> 
        <artifactId>maven-jetty-plugin</artifactId> 
        <configuration> 
         <connectors> 
          <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> 
           <port>${jetty.port}</port> 
           <maxIdleTime>60000</maxIdleTime> 
          </connector> 
         </connectors> 
         <scanIntervalSeconds>10</scanIntervalSeconds> 
         <contextPath>/${jetty.webcontext}</contextPath> 
         <webXml>${jetty.docroot}/WEB-INF/web.xml</webXml> 
         <webAppSourceDirectory>${jetty.docroot}</webAppSourceDirectory> 
         <!-- maven3 
         <webApp> 
          <contextPath>/${jetty.webcontext}</contextPath> 
          <descriptor>${jetty.docroot}/WEB-INF/web.xml</descriptor> 
          <baseResource>${jetty.docroot}</baseResource> 
         </webApp> 
         --> 
         <systemProperties> 
          <systemProperty> 
           <name>java.awt.headless</name> 
           <value>true</value> 
          </systemProperty> 
         </systemProperties> 
        </configuration> 
        <executions> 
         <execution> 
          <id>jetty-run</id> 
          <phase>prepare-package</phase> 
          <goals> 
           <goal>run</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
Смежные вопросы