Как изменить содержимое или заменить файл, который находится в каталоге webapp проекта Maven webapp

У меня есть проект веб-приложения Maven. Он имеет структуру каталогов по умолчанию, как показано ниже -

 |-- pom.xml
 `-- src
     `-- main
         |-- java
         |   `-- com
         |       `-- example
         |           `-- projects
         |               `-- SampleAction.java
         |-- resources
         |   `-- images
         |       `-- sampleimage.jpg
         `-- webapp
             |-- WEB-INF
             |   `-- web.xml
             |-- index.jsp
             `-- jsp
                 `-- websource.jsp

Генерируемый им файл WAR имеет следующую структуру, которая снова основана на значениях по умолчанию -

  |-- META-INF
  |   |-- MANIFEST.MF
  |   `-- maven
  |       `-- com.example.projects
  |           `-- documentedproject
  |               |-- pom.properties
  |               `-- pom.xml
  |-- WEB-INF
  |   |-- classes
  |   |   |-- com
  |   |   |   `-- example
  |   |   |       `-- projects
  |   |   |           `-- SampleAction.class
  |   |   `-- images
  |   |       `-- sampleimage.jpg
  |   `-- web.xml
  |-- index.jsp
  `-- jsp
      `-- websource.jsp

Я хочу переименовать web-prod.xml в web.xml, который находится в каталоге webapp, перед упаковкой в ​​WAR. Теперь загвоздка в том, что содержимое этого каталога копируется в target/<finalName> maven-war-plugin только на этапе упаковки, и сразу же создается WAR.
Поскольку содержимое webapp копируется по умолчанию maven-war-plugin, другие плагины как maven-compiler-plugin и maven-resources-plugin, которые появляются раньше, не имеют никакого отношения к изменению указанного файла.

pom.xml

<build>
    ...
    <plugins>
        ...
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>replace-descriptor</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <delete file="${project.build.directory}/${project.finalName}/WEB-INF/web.xml" />
                            <move file="${project.build.directory}/${project.finalName}/WEB-INF/web-prod.xml" tofile="${project.build.directory}/${project.finalName}/WEB-INF/web.xml"/>
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <archiveClasses>true</archiveClasses>
                <attachClasses>true</attachClasses>
                <warSourceIncludes>WEB-INF/**</warSourceIncludes>
                <packagingExcludes>WEB-INF/classes</packagingExcludes>
                <webResources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <targetPath>WEB-INF/classes</targetPath>
                        <includes>
                            ...
                        </includes>
                    </resource>
                    <resource>
                        <directory>${project.build.directory}/classes</directory>
                        <includes>
                            ...
                        </includes>
                        <targetPath>WEB-INF/classes</targetPath>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
</build>

web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" metadata-complete="true" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <display-name>NSWeb</display-name>
    ...
    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.example.core.security.filter.CORSFilter</filter-class>
    </filter>
    ...
</web-app>

web-prod.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" metadata-complete="true" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <display-name>NSWeb</display-name>
    ...
    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.example.core.security.filter.CORSFilter</filter-class>
        <init-param>
            <description>A comma separated list of allowed origins. Note: An '*' cannot be used for an allowed origin when using credentials.</description>
            <param-name>cors.enabled</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            ...
        </init-param>
        <init-param>
            ...
        </init-param>
        <init-param>
            ...
        </init-param>
        ...
    </filter>
    ...
</web-app>

person Sid    schedule 14.07.2021    source источник
comment
Почему вам нравится переименовывать web-prod.xml в web.xml?   -  person khmarbaise    schedule 14.07.2021
comment
web-prod.xml предназначен для производственного развертывания. Следовательно, я хочу, чтобы это было доступно как настоящая web.xml перед военная упаковка.   -  person Sid    schedule 14.07.2021
comment
В чем именно между ними разница? Помимо наличия зависимостей от окружения в вашем артефакте (военном файле) должен быть .. должен применяться извне .... Tomcat?   -  person khmarbaise    schedule 14.07.2021
comment
Он имеет некоторые конфигурации политик CORS, которые варьируются от env к env. Кроме того, мы используем maven-cargo-plugin вместе с Cargo Daemon, который автоматически загружает и запускает сервер Tomcat, а также развертывает на нем артефакт. Таким образом, мы не можем вручную настроить Tomcat для использования web.xml извне.   -  person Sid    schedule 14.07.2021
comment
Повторяю свой вопрос: Чем твой прод отличается от обычного web.xml ...? Что за информация разница? Используете плагин Cargo в продакшене или в разработке?   -  person khmarbaise    schedule 14.07.2021
comment
Как я уже упоминал, он имеет некоторую конфигурацию политики CORS. Использование плагина Cargo для UAT. Просто игнорируйте терминологию, пожалуйста. Просто подумайте, что в обоих файлах web.xml есть два разных набора конфигураций, которые относятся к двум различным средам, и правильный файл должен быть упакован в war.   -  person Sid    schedule 14.07.2021
comment
@Sid есть ли причина, по которой вы не используете maven-cargo-plugin war функцию слияния web.xml для этого? или наложение?   -  person eis    schedule 15.07.2021
comment
или функция фильтрации   -  person eis    schedule 15.07.2021
comment
Кроме того, я не вижу web-prod.xml в исходном коде вашего примера. Это могло бы помочь, если бы вы указали значения в вопросе, чтобы фактически воспроизвести проблему (например, у вас есть и web.xml, и web-prod.xml, или что-то еще)   -  person eis    schedule 15.07.2021
comment
maven-cargo-plugin функция слияния web.xml и функция maven-war-plugin наложения предназначены для слияния двух файлов WAR. Не думаю, что они подходят под мой случай. Я не стал использовать функцию фильтрации, так как есть 40 лишних строк, которые мне придется заменить через заполнитель. Я все равно могу попробовать сейчас.   -  person Sid    schedule 15.07.2021


Ответы (1)


Спасибо eis за то, что указал мне на функция фильтрации!
Раньше я поддерживал два разных файла web.xml и пытался заменить один на другой, так как между ними была разница примерно в 40 строк блока файлы. Я мог бы достичь конечного результата, изменив то же самое и НЕ, заменив его другим. Вот пошаговое объяснение решения:

  1. Имейте один файл web.xml с заполнителем, который нужно заменить блоком.
  2. Включите фильтрацию ресурсов для maven-war-plugin и используйте профили.
  3. Имейте два разных файла свойств для хранения целевых значений для заполнителя.

web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" metadata-complete="true" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app
<build>
    ...
    <filters>
        <filter>src/main/resources/place-holders-${targetenv}.properties</filter>
    </filters>
    <plugins>
        
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                ...
                <webResources>
                    ...
                    <resource>
                        <directory>${basedir}/src/main/webapp/WEB-INF</directory>
                        <filtering>true</filtering>
                        <targetPath>WEB-INF</targetPath>
                        <includes>
                            <include>**/web.xml</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <targetenv>dev</targetenv>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <targetenv>prod</targetenv>
        </properties>
    </profile>
</profiles>
1.xsd" id="WebApp_ID" version="3.1"> <display-name>NSWeb</display-name> ... <filter> <filter-name>corsFilter</filter-name> <filter-class>com.example.core.security.filter.CORSFilter</filter-class> @web.xml.cors.config@ </filter> ... </web-app>

pom.xml

<build>
    ...
    <filters>
        <filter>src/main/resources/place-holders-${targetenv}.properties</filter>
    </filters>
    <plugins>
        
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                ...
                <webResources>
                    ...
                    <resource>
                        <directory>${basedir}/src/main/webapp/WEB-INF</directory>
                        <filtering>true</filtering>
                        <targetPath>WEB-INF</targetPath>
                        <includes>
                            <include>**/web.xml</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <targetenv>dev</targetenv>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <targetenv>prod</targetenv>
        </properties>
    </profile>
</profiles>

place-holder-dev.properties [просто пустое место для разработчика]

web.xml.cors.config= 

place-holder-prod.properties

web.xml.cors.config=<init-param>\
\n\t\t\t<description>A comma separated list of allowed origins. Note An '*' cannot be used for an allowed origin when using credentials.</description>\
\n\t\t\t<param-name>cors.enabled</param-name>\
\n\t\t\t<param-value>true</param-value>\
\n\t\t</init-param>\
\n\t\t<init-param>\
        ...
\n\t\t</init-param>\
\n\t\t<init-param>\
        ...
\n\t\t</init-param>\
        ...
        ...
person Sid    schedule 15.07.2021