IDEA项目路径初探
IDEA项目路径
普通Java项目
普通Java项目,标准目录结构src下的路径就是classpath
类路径,每次编译都会将src目录下新增的类和资源文件打包进类路径。
如下图,类文件和配置文件都会被编译打包进类路径
maven构建Java项目
maven标准目录结构:
src
-main
–bin 脚本库
–java java源代码文件
–resources 资源库,会自动复制到classes目录里
–filters 资源过滤文件
–assembly 组件的描述配置(如何打包)
–config 配置文件
–webapp web应用的目录。WEB-INF、css、js等
-test
–java 单元测试java源代码文件
–resources 测试需要用的资源库
–filters 测试资源过滤库
-site Site(一些文档)
target
LICENSE.txt Project’s license
README.txt Project’s readme
工程根目录下就只有src和target两个目录,target是有存放项目构建后的文件和目录,jar包、war包、编译的class文件等。target里的所有内容都是maven构建的时候生成的。
以上摘自:MAVEN项目标准目录结构
在IDEA中快速创建一个普通maven项目,选择maven-archtype-quickstart
一项,就可以创建一个maven管理的Java项目。
可以看到,一个最基本的maven项目有src目录,并且该目录下存在main和test两个目录。
简单介绍:
src/man/java
:存放类源代码,其编译输出到target-classes
路径下。
src/test/java
:存放测试代码,其编译输出到target-test-classes
路径下。
如果我新增一个配置文件在java下,按常理来说源代码(java目录下的文件)路径下的文件都会被打包到类路径下,但是对于maven来说,默认情况下,maven只会按照标准的目录结构查找和处理文件,对于其他文件不予处理。
如下示例:jdbc.properties
没有被maven处理
但是如果想要它被编译输出到classpath
下,也不是不可以。
解决方案
1、项目中新建一个resources
目录,在IDEA中必须将其标记为Resources
,resources
是maven项目下的一个标准目录结构,maven对于resources下的文件就会将其打包到类路径下。IDEA中,如果新建的resources
目录并没有将其标记为Resources
,尽管同名,但是maven还是依旧不会处理。
2、使用maven-resources-plugin
插件。
示例一:正常处理
编译测试,结果如下
注:maven仅仅是将resources
目录下的文件打包输出到target-classes
路径下,不是将resources
目录打包到target-classes
。
示例二:违反maven目录结构约束
修改pom文件,build
标签下添加resources
设置
<resources>
<resource>
<!--从此目录下读取全部以.properties和.xml开头的文件-->
<directory>src/main/java/</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
感兴趣的伙伴可以尝试一下。这种方式你说它不合常规,其实也不这么绝对,框架采用这种方式居多。比如SSM,如果将Mybatis下的mapper统一和类放在一起,而不是放在resources目录下(hibernat就是这样做的),采用上述设置,maven可以将类连通相邻的配置文件一起打包进类路径。
普通web项目
tomcat下标准的web目录结构形式:
JavaWebApp
web应用上下文,根目录,根目录下存放的一般是静态资源文件,WEB-INF
目录,正常开发来说它标准的子目录结构就是这两个classes
:类路径,存放java字节码文件、lib
:存放项目所引用到的第三方jar
库。并且WEB-INF
目录下的文件对外都是不可访问的,只能通过内部进行处理,有时我们也会把一些不想让客户直接访问到的静态资源放入到这个目录下。
在IDEA中,web的项目结构如下,可以看到普通的web项目默认编译输出路径和普通的Java项目编译输出路径其实是相同的,都是将编译后的字节码放到了项目根目录下的名为out/production
目录下,这些默认配置做的都挺好的,能够及时看到编译后的结果。同样我们也可以更改这些默认输出路径,后面会有演示。
普通的servlet
会用到tomcat几个jar
,可以在Dependencies
选项卡中将tomcat的运行时的类库导入
这里scope选项为provided
的含义就是该包只在编译期起作用,不会被打包进war,jar
包由tomcat提供。
我们对项目进行部署,查看编译之后的目录结构是怎么样的
以上几个箭头和方框仅仅演示了java
文件编译打包到WEB-IFN/classes
文件的过程(在没有更改编译输出和Artifacts面板中的Output directory路径的前提下)。
之前保留了一张Eclipse下web项目完整的映射图
总结
1、web项目下的源码文件编译后最终会放入WEB-INF/classes
目录下
2、web、webapps、webcontent、webroot分别是IDEA和eclipse中对web项目根目录名称不同的叫法,本质上都是web项目根目录,对于Eclipse来说,部署的时候都是将其下的所有文件部署到webapps目录下的,对于IDEA,是通过创建tomcat实例,将某个url映射到具体的磁盘路径上实现项目的发布。
web、webapps、webcontent、webroot目录就是web应用的根目录,我们发布项目,挑明了就是将根目下的文件打包发布,那些配置文件之类的去哪了?看前面的编译流程,所有的配置文件都会被打包进类路径,为类所用,所以说配置文件最终也会汇聚到web应用根目录里面去。
网上对于新建一个web工程有很多介绍,在新建web的过程中,有的会特意的去web下新建classes、lib目录,并且修改项目编译输出目录?为什么?不这样做有影响吗?
为什么要新建一个classes还要更改其编译输出目录?
即如图操作:
一个标准的web目录结构请看上图,这样做的原因就是使其目录结构更加规范(站在人的视角),但是新建一个classes目录还没有完,因为idea是不承认WEB-INF/classes
该路径是编译输出路径的,必须将上图横线部分选中然后浏览到具体的目录才可以,之后idea不会在项目根目录下新建一个out/production
目录,而是直接将WEB-INF/classes
作为编译输出。像刚开始没有新建classes目录,web项目也能正常部署,并且应用根目录下也存在WEB-INF/classes
这个目录,其实是强大的编译器帮我们做了。
maven构建web项目
idea文件图标介绍
下面以一个maven管理下的标准web项目作为示例:
maven管理下,java和resources目录下的文件都会被打包编译到target-classes
,也就是我们常说的类路径。
对于小蓝点表示的文件夹则不属于maven管理,小蓝点表示的文件夹代表web资源所在目录,外部所访问到的也就是该目录下的文件。
这里主要介绍web资源目录即小蓝点所在的目录如何去设置,它和同级别的resources目录有什么不同?
对于一个普通的web项目,默认情况下,小蓝点自动标识到了web目录上,如果将其取消会怎么样?
这里伙伴们可以尝试一下,新建一个普通的web项目,将其小圆点取消掉,具体的做法如下图
取消掉之后,小蓝点消失,index.jsp也没有被发布到webapp目录下,说明Web Reources Directory
设置的目录下的文件都会被打包进根目录(webapp)下,否则即使web目录下存在许多静态资源文件,由于不会被idea打包进去,最终访问结果404。
这里还有一个选项是Path Relative to Deployment Root
,这一个路径规定了让idea在打包的时候是相对于哪个路径打包,默认是相对于根路径,如果我设置为/jsp
,那么index.jsp在被打包的时候,就会相对于web根目录下的/jsp
目录,将index.jsp文件打入它的目录下,如果该目录不存在,idea会自动创建。
Web Reources Directory
的正确配置,可以让idea自动地将目录下的资源文件成功地发布到webapp目录下,以便能够被外部访问。默认情况下,idea自动将web根目录即应用部署下的目录设置为资源路径,其实我们还可以新增其他的资源路径,将其他路径下的文件发布到webapp目录,如下
在webmvc项目根目录下,新增了一个不合常规的目录resources并且将其设置为web资源目录(小蓝点),将其打包到web根下的res目录
编译输出的目录结构如下:
web资源路径的设置可以在modules或者facets下的web模块设置:
总结:
1)普通的Java项目和web项目src路径下的java文件和配置文件都会被打包到类路径下。
2)maven管理的Java项目和web项目,resources目录和java目录都会被编译到类路径下,对于web来说还会有进一步转化,类路径下的文件最终都会存放在web应用根目录下的WEB-INF/classes
目录下。
3)idea默认将web应用根目录作为资源目录,其下的文件和文件夹都会打包到根目录,并部署到tomcat。
4)若webapp目录下存在resources目录,它和maven下的resources目录是不同的,webapp下的resources目录默认打包到根目录下,maven下的resources目录下的文件打包到类路径下。
思考:对于SpringBoot项目,如果想让webapp目录下的文件,能够被外部访问到,如何去做?
IDEA项目路径初探的更多相关文章
- asp.net 获取当前项目路径
方法一://获取当前项目的路径System.AppDomain.CurrentDomain.BaseDirectory.ToString(); // 得到的是当前项目的根目录取的值:F://Pro ...
- cocos studio UI 1.6.0.0 修改导出项目路径
因为cocos studio UI 1.6.0.0版本没有自动修改默认导出路径的功能,新建项目后默认导出的路径还是上一个项目的,每次导出都要重新设置路径很麻烦.于是考虑是否可以找到默认配置文件,终于还 ...
- SSH框架通过JFreeChart实现柱状图和获取项目路径
获取项目路径:String url= ServletActionContext.getRequest().getRealPath("/upload"); 一.直接生成的图片输出到j ...
- springboot配置server相关配置&整合模板引擎Freemarker、thymeleaf&thymeleaf基本用法&thymeleaf 获取项目路径 contextPath 与取session中信息
1.Springboot配置server相关配置(包括默认tomcat的相关配置) 下面的配置也都是模板,需要的时候在application.properties配置即可 ############## ...
- 纯html页面中js如何获得项目路径
js,全称javascript,不过虽然是以java开头,不过与java一点关系都没有. js和java有如下区别: (1)js是浏览器端的语言,而java是服务器端的语言. (2)js是动态语言,j ...
- tomcat中实现特定路径下的图片的url访问Tomcat配置图片保存路径,图片不保存在项目路径下
使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项目路径下,那么再次打war包发布项目可能会造成图片的丢失,每次重启前将图片先保存再copy到服务器明显不方便,这时可以配置图片保 ...
- linux下通过软连接实现访问项目路径外面的资源
在javaweb项目开发中,图片上传是个比较常见的场景.一般都是在项目路径下建个文件夹,然后上传到该文件夹下:这样这个图片就可以和静态资源一样被直接访问.这样的好处就是访问这图片特别方 ...
- javascript 获取当前部署项目路径
javascript 获取当前部署项目路径 ========================================= javascript获取当前部署项目路径: 主要用到Location 对 ...
- tomcat在conf/Catalina/localhost目录下配置项目路径
转自:http://wangyl93-dl-cn.iteye.com/blog/1508517 在tomcat的conf/Catalina/localhost目录下配置项目路径,tomcat启动是会直 ...
随机推荐
- JVM中的对象
虚拟机中的对象 对象的分配 虚拟机遇到一条new指令时:根据new的参数是否能在常量池中定位到一个类的符号引用,如果没有,说明还未定义该类,抛出ClassNotFoundException: 1)检查 ...
- get_started_3dsctf_2016
题外:这道题不是很难,但是却难住了我很久.主要是在IDA中查看反编译出的伪代码时双击了一下gets()函数,结果进入gets函数内部,我当时就懵了,误以为这是一个自定义函数,但是自定义函数应该应该不能 ...
- html基础:DOM操作
DOM(Document Object Model 文档对象模型) 一个web页面被封装成一个dom对象,通过dom中的js对页面的标签进行操作 一.获取对象 浏览器页面上右键--检查--consol ...
- JZOJ1496 页
Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场精彩的天马队列变换表演.首先,战神安排n头高度不同 ...
- Keepalived之高可用LVS集群
前文我们聊了下keepalived的邮件通知相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13645163.html:今天我们来说说keepalive ...
- DevOps-实践心得
基于最近几年从事与DevOps的相关实践,对这篇文章的观点深有体会,所以记录在这里.加粗部分是我比较深有体会的,但是对于最后作者对于"运维"有些悲观,我有点不敢苟同,反而对于运维的 ...
- ASP.NET Core 性能优化最佳实践
本文提供了 ASP.NET Core 的性能最佳实践指南. 译文原文地址:https://docs.microsoft.com/en-us/aspnet/core/performance/perfor ...
- Robotframework自动化7-数据库连接
一.连接mysql数据库 1.安装pymysql: pip install pymysql pip install robotframework-databaselibrary 导入库Datab ...
- [LeetCode]547. 朋友圈(DFS)
题目 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的集 ...
- maven-shade-plugin插件未生效原因分析
今天在项目的pom文件中引入maven-shade-plugin插件,构建一个uber-jar(包含所有依赖的jar包),但是诡异的事情出现了,执行mvn package后生成的jar包竟然没有包含被 ...