使用 jetty:run 时运行资源过滤器

Posted

技术标签:

【中文标题】使用 jetty:run 时运行资源过滤器【英文标题】:Running resource filters when using jetty:run 【发布时间】:2010-11-14 04:49:07 【问题描述】:

我在 jsps 上使用基于配置文件的资源过滤。我也在使用mvn jetty:run进行本地开发,但是过滤阶段没有运行。

如何使用 jetty 插件进行过滤?


配置sn-ps

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
    <webResources>
        <resource>
            <directory>src/main/webapp</directory>
            <includes>
                <include>error.jsp</include>
            </includes>
            <filtering>true</filtering>
            <targetPath>/</targetPath>
        </resource>
    </webResources>
</configuration>
</plugin>

<profile>
    <id>jci</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <property>
            <name>jci</name>
        </property>
    </activation>
    <properties>
        <error.title>Some value here</error.title>
    </properties>
</profile>  

【问题讨论】:

@Robert:你有没有找到解决这个问题的办法?当我遇到你的问题时,我倾向于发布类似的问题...... Running jetty:deploy-war 让我更进一步,但仍然没有真正可行的解决方案。有人对这个问题有真正的答案吗? 【参考方案1】:

您可能想要使用 jetty:run-exploded 目标而不是 jetty:run。来自the documentation:

这个目标首先将你的 webapp 组装成一个分解的 war 文件,然后将它部署到 Jetty。

这可以确保在服务器启动之前执行适当的战争生命周期阶段。

您还确定 jci 配置文件正在被激活吗?如果为构建指定了另一个配置文件, 属性将不会启用配置文件,请参阅this bug 了解详细信息。

来自 John Casey 的回复:

上面的例子按设计工作。 元素旨在指定如果构建中没有其他配置文件处于活动状态,则将激活此配置文件。因此,任何配置文件的特定激活都会导致该配置文件被停用。

【讨论】:

感谢您的回答。我会调查一下run-exploded。是的,我确定个人资料处于活动状态,这不是问题。 mvn jetty:run-exploded -Dmaven.test.skip=true 是赢家。谢谢! 抱歉,很快就联系上了。 jsp 更改和 javarebel 类重新加载似乎都没有生效。【参考方案2】:

过滤后的文件通常最终位于构建目标目录中。如果你运行 'mvn jetty:run',它默认使用你未过滤的 src/main/webapp 目录。您所要做的就是将构建目标添加为附加资源目录。完成后,jetty 将创建一个叠加层并使用过滤后的文件。

                <plugin>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>maven-jetty-plugin</artifactId>
                    <version>6.1.26</version>
                    <configuration>
                        <webAppConfig>
                            <contextPath>/$project.build.finalName</contextPath>
                            <baseResource implementation="org.mortbay.resource.ResourceCollection">
                                <resourcesAsCSV>src/main/webapp,$project.build.directory/$project.build.finalName</resourcesAsCSV>
                            </baseResource>
                        </webAppConfig>
                        <scanIntervalSeconds>2</scanIntervalSeconds>
                    </configuration>
                </plugin>

【讨论】:

【参考方案3】:

感谢@Randy,我也设法让它工作了。下面是一个最新的例子,展示了资源过滤和使用 org.eclipse.jetty 而不是旧的 mortbay 的码头变基 baseResource。 在这里,我们过滤两个 jsp 页面 login.jsp 和 index.jsp,并根据下面的属性部分将 jsp 中的变量“$login.resources”设置为“login.res.jsp”。 请注意,我们过滤并将这些写入“jetty.docroot”,然后我们将 jetty.docroot 覆盖在 src/main/webapps 上,以便我们过滤的 jsps 被 jetty 使用。覆盖从@Randy 更新为使用更新的“org.eclipse.jetty.util.resource.ResourceCollection”实现。

<profiles>
<profile>
    <id>jetty</id>

    <properties>
        <jetty.docroot>$project.build.directory/jetty</jetty.docroot>
        <login.resources>login.res.jsp</login.resources>
    </properties>

    <build>

        <plugins>

            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
                <executions>
                    <execution>
                        <id>jetty-docroot</id>
                        <!-- test-compile precedes jetty:run -->
                        <phase>test-compile</phase>

                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>$jetty.docroot</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>$basedir/src/main/webapp</directory>
                                    <filtering>true</filtering>
                                    <includes>
                                        <include>**/login.jsp</include>
                                        <include>**/index.jsp</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>

                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.0.v20161208</version>
                <configuration>

                    <scanIntervalSeconds>2</scanIntervalSeconds>

                    <webApp>
                        <contextPath>/intamerge</contextPath>
                         <baseResource implementation="org.eclipse.jetty.util.resource.ResourceCollection">

                             <resourcesAsCSV>$jetty.docroot,$basedir/src/main/webapp</resourcesAsCSV>
                            </baseResource>
                        <baseAppFirst>false</baseAppFirst>
                    </webApp>


                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

【讨论】:

以上是关于使用 jetty:run 时运行资源过滤器的主要内容,如果未能解决你的问题,请参考以下文章

使用 mvn jetty:run 运行嵌入式 H2 数据库

Jetty Run War 仅使用命令行

带有 DataSource 的 jetty-env.xml 导致 mvn jetty:run 上的 WebAppContext 失败

java项目和web项目中的过滤器文件怎么使用?

Filter过滤器

java web 过滤器跟拦截器的区别和使用