Maven:将生成的 tomcat-maven-plugin 资源放在哪里?

Posted

技术标签:

【中文标题】Maven:将生成的 tomcat-maven-plugin 资源放在哪里?【英文标题】:Maven: Where to put generated resources for tomcat-maven-plugin? 【发布时间】:2022-01-17 14:17:26 【问题描述】:

我的项目的 src/main/webapp 目录中有 CSS 和 javascript 文件。 我想加入将这些资源的加入和缩小版本添加到我的 WAR 文件以及 tomcat-maven-plugin 获取它的位置。

我使用 yuicompressor-maven-plugin 创建文件并将其放到$project.build.directory/$project.build.finalName。它适用于 maven 包,并且这些资源可以进入 WAR 文件,但不知何故 tomcat-maven-plugin 根本看不到这些。我应该为它使用不同的目录吗?

我的 pom:

    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.1</version>
            <configuration>
                <path>/MyApp</path>
                <warDirectory>$project.build.directory/$project.build.finalName</warDirectory>
            </configuration>
        </plugin>
        <plugin>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <optimize>true</optimize>
                <debug>true</debug>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <webResources>
                    <resource>
                        <directory>$basedir/src/main/resources/META-INF</directory>
                        <filtering>true</filtering>
                        <targetPath>META-INF</targetPath>
                        <includes>
                            <include>context.xml</include>
                        </includes>
                    </resource>
                </webResources>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                    <manifest>
                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>yuicompressor-maven-plugin</artifactId>
            <version>1.3.0</version>
            <executions>
                <execution>
                    <phase>process-resources</phase>
                    <configuration>
                        <excludes>
                            <exclude>**/*</exclude>
                        </excludes>
                        <aggregations>
                            <aggregation>
                                <output>$project.build.directory/$project.build.finalName/js/commons-pack.js</output>
                                <includes>
                                    <include>$project.build.sourceDirectory/../webapp/js1.js</include>
                                    <include>$project.build.sourceDirectory/../webapp/js2.js</include>
                     ...

我应该怎么做才能让mvn tomcat:run 也能提取我生成的文件?

【问题讨论】:

【参考方案1】:

使用warSourceDirectory:

<warSourceDirectory>$project.build.directory/$project.build.finalName</warSourceDirectory>

而不是 tomcat-maven-plugin 的此配置属性 (warDirectory):

<warDirectory>$project.build.directory/$project.build.finalName</warDirectory>

根据tomcat-maven-plugin documentation,warSourceDirectory是web资源获取的地方,默认值为$basedir/src/main/webapp。这意味着如果您不设置该属性,则需要在$basedir/src/main/webapp 下生成统一/缩小的 JavaScript 文件。

如果你将warSourceDirectory设置为输出文件夹,这意味着你需要在启动Tomcat之前生成这个文件。

【讨论】:

设置warSourceDirectory 网站后停止工作:) 我错过了什么吗?可能我应该把所有东西都移到那个目录吗? 如果您将warSourceDirectory 设置为build 文件夹,则必须事先执行mvn package 才能实际处理资源。【参考方案2】:

或者,您也可以使用run-war 目标而不是run,例如mvn tomcat6:run-war。这将使用构建目录中的爆炸战争(因此过滤资源)。见this site。还有run-war-only跳过打包阶段。

【讨论】:

【参考方案3】:

请注意,该插件现在由 Apache 维护(所以升级一点 :-))请参阅 http://tomcat.apache.org/maven-plugin-2.0/。

即使它可以使用 install 我不确定它是否是最佳解决方案(关于 io 和构建时间)。

tomcat 运行必须能够使用来自多个目录的资源(我不确定当前的 tomcat 嵌入 api 是否可行)。

你能在这里添加一个功能请求吗https://issues.apache.org/jira/browse/MTOMCAT

谢谢

【讨论】:

是否可以将所有静态资源(webapp)复制到例如 target/ 目录并将 tomcat 指向那里? 可以使用maven.apache.org/plugins/maven-resources-plugin/examples/…

以上是关于Maven:将生成的 tomcat-maven-plugin 资源放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Maven生成项目文档

将 maven 代码生成转换为 gradle 任务

如何在 Maven 中使用模板代码生成器(例如 freemarker)?

使用 maven 将版本号输出到文本文件

将生成的 jar 文件的名称从 Maven pom.xml 传递到 Dockerfile

Maven - Maven Build Life Cycle - maven tutorial