1、触发事件

今天正好在学习log4j,为了测试其配置文件log4j.properties中的各种配置,进行了频繁修改和程序启动以确认效果,因为是使用的IDEA建立的Web项目,接着问题就来了,配置文件修改后,重新运行Tomcat发现根本没有生效,刚开始怀疑是文件中配置的写法不对而且google了很久,反反复复发现配置没有问题但是就是不行。

幸好知道IDEA中对于artifacts的定义,相当于部署包,Tomcat运行时实际是去读取的这个东西里的文件,其编译方式之前在另篇博客《理解 IntelliJ IDEA 的项目配置和Web部署》中也有提到,一会儿在下面再单独提一下。所以接下来,我又找到artifacts的文件夹目录,到里面去找log4j.properties看看,发现配置内容还是我更改之前的,怪不得运行没有效果,因为真正读取的配置文件根本就没有改变。

可是IDEA编译的时候不是会把目录内容复制到artifacts目录下吗?为什么不是最新的配置文件?目前猜想可能跟IDEA版本有关,这个留在下面在讲。

大概的触发事件就是这样,不过最终还是得到了解决,大概写一下,说不定能帮助到别人。


2、IDEA的编译方式

这里提IDEA的编译方式,是为了最后更好地描述和理解。

IDEA的编译方式和Eclipse不同,它并不是自动编译,而是每次在容器运行之前进行先编译,再运行。我们可以看到Tomcat中的容器配置:

 
IDEA中编译方式有如下三种,如上图所示,这里我们每次容器运行之前,都进行了Make方式的代码编译:
  • Compile:对选定的目标(Java 类文件),进行强制性编译,不管目标是否是被修改过。
  • Rebuild:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过,由于 Rebuild 的目标只有 Project,所以 Rebuild 每次花的时间会比较长。
  • Make:使用最多的编译操作。对选定的目标(Project 或 Module)进行编译,但只编译有修改过的文件,没有修改过的文件不会编译,这样平时开发大型项目才不会浪费时间在编译过程中。

另外,注意看第二个黄色标记的地方 “Build '你的artifact名称' artifact”,这里就要提到容器运行时,IDEA都做了什么(更多详情参考《理解 IntelliJ IDEA 的项目配置和Web部署》):
  • 在运行server前会做一次编译。编译后class文件存放在指定的项目编译输出目录下;
  • 根据artifact中的设定对目录结构进行创建;
  • 拷贝web资源的根目录下的所有文件到artifact的目录下;
  • 拷贝编译输出目录下的classes目录到artifact下的WEB-INF下;
  • 拷贝lib目录下所需的jar包到artifact下的WEB_INF下;
  • 运行server,运行成功后,如有需要,会自动打开浏览器访问指定url。


3、大概是IDEA10的特例

了解了IDEA的编译方式,可以知道,那么就算是配置文件,只要其所在文件夹设置为了资源目录,那么在容器运行的时候,实际上也是会将里面的内容复制到最后的artifact中去的,可是我自己在尝试的时候IDEA却没有按常理出牌。

我找了下相关的问题,有的网友贴了图,我才发现,高版本的IDEA中对于配置文件的目录,有单独的资源标志。如下有网友回答情况:

 
标记为Resources的目录会被复制到artifact中。

可是我看了下我的IDEA10的配置结构,并没有这个东西:
 
就算配置文件的目录标志为唯一能用的Sources了,IDEA还是不给我复制。所以我理解,Sources可能只会复制过去能编译的文件,最终复制过去的即是 .class 文件,而诸如 .properties 的配置文件是不会复制的。

怎么办,难道要手动复制?幸好,网友的力量是强大的,按照如下步骤执行:

1、把所需要的配置文件的文件夹,以依赖的方式导入项目:
 
2、在artifact配置中,将这两个文件夹添加进去
 
3、添加完成后会发现,左侧output_root中就有了这两个文件夹目录,之后容器在运行的时候,就会将这文件夹中的内容复制到artifact中去,也就是达到了我们的目的
 
此时再运行,每次的配置文件修改,都可以看到效果变更了。
 
什么,你问我为什么项目一开始运行的时候没有发现这个问题?因为这个项目老大第一次给我的时候,配置文件直接就已经在artifact中有一份了,并不知道是他之前手动放进去的,还是怎么回事。

而且,其实更另我困惑的是,其他的配置文件诸如strust.xml,之前我也并没有按照如上所述解决方案去进行处理,可是修改后是可以生效的,我也就搞不懂到底是IDEA哪里出了问题,之前可以现在不行,摊手。所以就有这个 “大概是IDEA10的特例” 的子标题。

很伤,反正不开心。


4、参考链接



最新文章

  1. R语言学习
  2. Laravel学习笔记(六)数据库 数据库填充
  3. C++内存泄露调试
  4. 4071: [Apio2015]巴邻旁之桥
  5. Web开发 < base target>
  6. JAVA中把ResultSet转换成LIST
  7. 程序员必须知道的几个Git代码托管平台(转)
  8. Eclipse 快捷键使用
  9. WCF中传递对象的成员变量行不通?
  10. NOPI读xls文件写到txt中(NPOI系列二)
  11. git几个必知托管平台
  12. ELK-ElasticSearch索引详解
  13. HBase——HMaster启动之二(HMaster线程的调用)
  14. NOIP2013题解
  15. 同行span标签设置display:inline-block;overflow:hidden垂直对齐问题
  16. C# 如何防止重放攻击
  17. ReentrantLock与synchronized
  18. axios post提交的Content-Type
  19. 批处理学习笔记14 - 把所有.mp4文件全部拷贝进统一目录
  20. CSS3之word-wrap英文单词溢出强制换行

热门文章

  1. elastalert基于微信公众号报警
  2. 集合-TreeSet-Comparable
  3. 【Oracle】控制文件管理
  4. fis3+vue+pdf.js制作预览PDF文件或其他
  5. CSS 学习笔记 - Flex 布局
  6. Linux中的定时任务at、crontab
  7. GUI RedHat7中常用的一些设置
  8. c# 替换所有中文、标点符号,全角转半角
  9. asp.net mvc 接入最新支付宝支付+退款 alipay-sdk-NET-20170615110549
  10. 浅谈服务器对SEO的影响,该如何选择服务器?