2015-12-10 56 views
3

我正在尝试创建一个运行Struts2的嵌入式Tomcat。如何强制嵌入式Tomcat查找struts.xml文件?

第一步是制作一个可用的纯嵌入式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加载的东西都在那里。

下一步:配置拦截器。在正常情况下,我需要将struts.xml文件放入“src \ main \ resources”文件夹(Eclipse)中。所以我尝试了这一点,而不是工作。

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

麻烦:struts.xml文件没有加载。我可以通过发送来自拦截器的方法输出输出并且混淆struts.xml文件(将拦截器类名称更改为不存在的名称,混淆标记结构等)来弥补这一点。

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

+0

有趣的实验! –

+0

你可以尝试(只是为了看看会发生什么):1)将struts.xml和action注释中的包的名称更改为不是'default'和2)的包,如果n.1不起作用,直接在动作文件上指定带有注释的拦截器堆栈?最后3)删除约定插件并在struts.xml中定义动作,以确保struts。xml实际上并没有被加载,并且没有被convention插件忽略或覆盖。 –

+0

嗨安德烈。 struts.xml文件没有被收回......我可以完全弄乱这个文件(用一些lorem ipsum填充)......并且没有任何瑕疵。 –

回答

0

尽管它不会直接回答OP,但是可以实现创建可执行的Fat jar的期望目标。未来的谷歌搜索可以从中受益。这与我操作的struts2一起工作.AFIK它可以用于任何web应用程序。

通过使用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。根据Tomcat Docs你可以通过在插件中显式提及所有的tomcat依赖关系来选择次要版本的tomcat(我还没有尝试过)。

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

+0

我想你错过了这个问题。我找不到任何可以让Struts2在你的答案中工作的参考。 –

+0

nope。添加这个尝试与maven目标包它将创建脂肪罐。你可以运行java -jar。我为我的web应用程序使用struts2和hibernate。 – udaybhaskar

+0

所以我只需要创建一个普通的Java Web应用程序(没有嵌入式Tomcat)并使用像这样的POM,它将成为一个独立的Web应用程序?你可以发布你的POM所有相关的项目,因为我已经可以创建一个独立的tomcat应用程序。我不能让Struts2工作。 –