背景
参与的一个小项目中有一个下载统计表的功能,实现方式是先将存有数据的Excel保存到项目的一个目录下(一般是recourses/files),然后通过前端的一个按钮链接到该目录,进而实现从服务器的该目录下down该Excel文件。
我遇到的绊脚石就是在server端保存文件的时候路径选择问题。
从网上搜索得到如下两种路径获取方式:
- 获取classes文件的路径
//获取的是该类的class文件所在的路径
classname.class.getClassLoader().getResource("/").getPath();
- 获取web项目的路径
//获取的是web项目的根路径
request.getSession().getServletContext().getRealPath("/")
有了上述两个路径后,就可以拼接出recourses/files的路径。
但是maven项目通过jetty:run和jetty:run-war编译后所查找的路径是不一样的,所以在代码中写死后,可能会出现找不到路径的情况。比如:
jetty:run
classes文件的路径为项目编译后生成的target目录下:D:/eclipse-workspace/lbg.testcenter/target/classes/
项目路径为webapp的路径,即:D:\eclipse-workspace\lbg.testcenter\src\main\webapp\resources\files\jetty:run-war
classes文件路径为生成war包名称目录下:D:/eclipse-workspace/lbg.testcenter/target/ltc.58corp.com/WEB-INF/classes/
项目路径为:D:\eclipse-workspace\lbg.testcenter\target\ltc.58corp.com
这里也许就能看出jetty:run和jetty:run-war的区别了,翻看官方文档,发现作出的解释如下(直接搬英文更直观):
- 使用jetty:run
Jetty deploys the webapp from its sources,t looks for the constituent parts of a webapp in the Maven default project locations,
by default it looks for:
● resources in ${project.basedir}/src/main/webapp
● classes in ${project.build.outputDirectory}
● web.xml in ${project.basedir}/src/main/webapp/WEB-INF/
- 使用jetty:run-war
This goal first packages your webapp as a WAR file
and then deploys it to Jetty
也就是说jetty:run使用的是项目默认的Maven路径,而jetty:run-war是输出了war包,并将war包部署到了jetty,使用的是war包里的路径。
好啦,怪不得我在本地用jetty:run编译用的路径和部署到服务器上后用的路径不一致呢。
另外还有一个自己踩的坑:在Windows上‘/’和‘\’都可以用于路径中,而在Linux下路径只能用‘/’。