`
jinnianshilongnian
  • 浏览: 21424164 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2403122
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2996146
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5630387
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257181
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1592644
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248792
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5845630
Group-logo
跟我学Nginx+Lua开...
浏览量:697465
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:779839
社区版块
存档分类
最新评论

maven 多module时测试springmvc+freemarker的问题总结

 
阅读更多

相关问题:

http://www.iteye.com/problems/95405

http://www.iteye.com/problems/74168 (该问题给出的方案是使用classpath)

 

原因分析:

比如你的maven工程是如下所示,包含很多子module:

test

  test-core

  test-web

 

如果在test-web中测试springmvc的项目时,会发现当前工作目录仍然是test 而不是test-web;所以问题就是出在这。

 

接下来提供几个方案:

1、绝对路径方式:

@WebAppConfiguration(value = "file:E:\\test\\test-web\\src\\main\\webapp")

FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();

configurer.setTemplateLoaderPath("file:E:\\lion\\lion-web\\src\\main\\webapp")

 

缺点很明显,如果需要在win/linux上切换 很痛苦

 

2、类路径方式:

@WebAppConfiguration(value = "classpath:template")

FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();

configurer.setTemplateLoaderPath("classpath:template");

 

缺点也是比较明显,需要复制两份模板。

 

3、通过获取webapp目录路径的方式:

FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();

String path = FreeMarkerConfig.class.getClassLoader().getResource(".").toString().substring(6);

String webappPath = path.replace("/target/test-classes/", "");

webappPath = webappPath.replace(wac.getServletContext().getRealPath(""), "");

webappPath = webappPath + "/src/main/webapp";

configurer.setTemplateLoaderPath("file:" + webappPath);

思路就是:先获取当前的测试类编译到的路径,然后往上获取到根,再拼上src/main/webapp即可拿到目录。

 

所以3更通用些。

 

如果你只需要使用maven test 运行:更好的方案是:

1、在test-web的pom.xml中添加

                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <systemProperties combine.children="append">
                                <property>
                                    <name>modulePath</name>
                                    <value>${project.basedir}</value>
                                </property>
                            </systemProperties>
                        </configuration>
                    </plugin>

project.basedir就是当前模块的目录。 

然后在测试类中通过:System.getProperty("modulePath"); 即可拿到该路径,但是如果在如idea集成环境中不好用。

 

还一种方案是如在idea中使用(具体没有测试):

Run->Edit configuration->Defaults->JUnit->Working directory set the value$MODULE_DIR$ and Intellij will set the relative path in all junits just like Maven.

http://stackoverflow.com/questions/5637765/how-to-deal-with-relative-path-in-junits-between-maven-and-intellij

 

 

从如上方案中可以看出,【3】是最通用的方案。

 

2
1
分享到:
评论
4 楼 jinnianshilongnian 2013-05-28  
lanhuidong 写道
jinnianshilongnian 写道
lanhuidong 写道
@WebAppConfiguration("lion-web/src/main/webapp")根据您的提示这么写就可以了哦。就是在默认值前加上模块名称lion-web/就好了。谢谢啊

这么不是很通用 因为【lion-web】 不过如果不变也是没关系的

一般项目建好后这个模块名也不怎么变动了,我觉得可以的,这样简单点

嗯,如果不变 这个最简单  

还一种方式就是重写Freemarker View 不让其去加载resource即可
3 楼 lanhuidong 2013-05-28  
jinnianshilongnian 写道
lanhuidong 写道
@WebAppConfiguration("lion-web/src/main/webapp")根据您的提示这么写就可以了哦。就是在默认值前加上模块名称lion-web/就好了。谢谢啊

这么不是很通用 因为【lion-web】 不过如果不变也是没关系的

一般项目建好后这个模块名也不怎么变动了,我觉得可以的,这样简单点
2 楼 jinnianshilongnian 2013-05-28  
lanhuidong 写道
@WebAppConfiguration("lion-web/src/main/webapp")根据您的提示这么写就可以了哦。就是在默认值前加上模块名称lion-web/就好了。谢谢啊

这么不是很通用 因为【lion-web】 不过如果不变也是没关系的
1 楼 lanhuidong 2013-05-28  
@WebAppConfiguration("lion-web/src/main/webapp")根据您的提示这么写就可以了哦。就是在默认值前加上模块名称lion-web/就好了。谢谢啊

相关推荐

Global site tag (gtag.js) - Google Analytics