如何强制嵌入式Tomcat查找struts.xml文件?

时间:2015-12-10 18:05:30

标签: java tomcat configuration struts2

我正在尝试使用Struts2创建一个嵌入式Tomcat。

第一步是制作一个纯粹的嵌入式Tomcat。 遵循本教程很容易做到:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/basic_app_embedded_tomcat/basic_app-tomcat-embedded.html#section4

现在,为了使Struts2正常工作,下一步是将Struts库添加到POM文件中。

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.struts.xwork</groupId>
        <artifactId>xwork-core</artifactId>
        <version>2.3.20</version>
    </dependency>       

    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.3.20</version>
    </dependency>

    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-convention-plugin</artifactId>
        <version>2.3.20</version>
    </dependency>   

一块蛋糕!下一步:将Struts过滤器添加到web.xml。很简单,但....嵌入式Tomcat不加载web.xml文件!不管我做什么。解决方案:在目标JAR文件夹下创建一个名为resources的文件夹,将web.xml文件放在那里并将此代码添加到服务器入门类:

tomcat.getHost().setAppBase(appBase);

StandardContext ctx = (StandardContext) tomcat.addWebapp(contextPath, appBase);
( (StandardJarScanner) ctx.getJarScanner() ).setScanAllDirectories(true);
ctx.getServletContext().setAttribute( Globals.ALT_DD_ATTR, "resources/web.xml");

tomcat.start();

这将从外部文件夹加载web.xml。工作得很好。现在我可以加载struts库。通过查看服务器日志我可以看到。加载东西的所有支柱都在那里。

下一步:配置拦截器。在正常情况下,我需要将struts.xml文件放入`src \ main \ resources'文件夹(Eclipse)。所以我尝试了这个并没有用。

我的struts.xml文件只有一个指向实现Interceptor的类的拦截器标记。我喜欢使用注释来配置Actions,因此我在此文件中没有Actions标记。这个struts.xml文件和拦截器类来自我所拥有的其他系统,它的工作非常好。非常简单。

麻烦:没有加载struts.xml文件。我可以通过从拦截器的intercept方法发送输出并弄乱struts.xml文件(将拦截器类名更改为不存在的类,弄乱标记结构等)来证实这一点。

我的问题:如何告诉嵌入式Tomcat加载struts.xml文件,或者更确切地说,如何告诉struts引擎struts.xml位置?

1 个答案:

答案 0 :(得分:0)

即使它不会直接回答OP。但是可以实现创建可执行Fat jar的理想目标。未来谷歌搜索可以从中受益。这与我做过的struts2一起工作。它将适用于任何网络应用

通过使用tomcat7-maven-plugin,它变成了和平的蛋糕。如上所述here。     

 <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.1</version>
     <executions>
       <execution>
        <id>tomcat-run</id>
        <goals>
            <goal>exec-war-only</goal>
        </goals>
        <phase>package</phase>
        <configuration>
            <path>/appName</path>
            <enableNaming>false</enableNaming>
            <finalName>appName.jar</finalName>
            <charset>utf-8</charset>
         </configuration>
     </execution>
  </executions>
</plugin> 

here中所述,你必须使用2.1或2.3,因为2.2有bug。根据{{​​3}},您可以通过在插件中明确提及所有tomcat依赖项来选择tomcat的次要版本(我还没有尝试过)。

如果你在maven中运行package目标,它将在目标文件夹中生成.jar文件。您可以使用java -jar appName.jar

运行它
相关问题