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、参考链接



IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题的更多相关文章

  1. docker for mac的JSON配置文件中的hosts项修改后无法生效

    docker for mac的JSON配置文件中的hosts项修改后无法生效 docker 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 增 ...

  2. 26.使用IntelliJ IDEA开发Java Web项目时,修改了JSP后刷新浏览器无法及时显示修改后的页面

    转自:https://blog.csdn.net/yuxxz/article/details/51318908 使用IntelliJ IDEA开发Java Web项目时,修改了JSP后刷新浏览器无法及 ...

  3. GridView更新后获取不到文本框修改后的值

    需要在Page_Load事件里为gridview绑定数据时,添加回传判断 if (!IsPostBack) { 绑定数据 }

  4. eclipse 使用tomcat运行JavaWeb项目,文件修改后为何不用重启tomcat? (运行web项目的4种方式)探究

                    1.情景说明 在eclipse中,为什么Java文件修改后,重启tomcat class文件才能生效? 为什么jsp修改后,不需重启tomcat就能立即生效? 为什么静 ...

  5. 运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

    运行编译后的程序报错  error while loading shared libraries: lib*.so: cannot open shared object file: No such f ...

  6. webstorm编写react native,代码修改后,重新编译运行没有变化的问题

    w我是拷贝一份react native代码到另一台电脑,发现修改代码运行之后不显示修改后的效果,即仍然与原来的效果一样,暂时不知道什么原因, 后来我运行了npm install 就可以了,不知道是不是 ...

  7. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

  8. ApkTool反编译apk,去除广告或者汉化后重新打包apk,并签名

    http://my.oschina.net/mopidick/blog/135581 以ubuntu的环境为例子,window的大同小异 首先下载apktool工具:https://code.goog ...

  9. 解决CentOS添加新网卡后找不到网卡配置文件,配置多网卡并设置静态路由

    参考文章 https://blog.csdn.net/qq_36512792/article/details/79787649 使用VMware Workstation虚拟机安装好CentOS7虚拟机 ...

随机推荐

  1. java调用copy复制子文件夹及文件到指定目录(非xcopy)

    因为作所以烦因为烦所以快乐...(为什么不先查一下有没有现成的命令,后悔啊!!) 不知道有xcopy这个命令就自己想写个复制子目录和文件的功能...以下故事诞生了 是这样的,昨天在学校弄的半成品,半成 ...

  2. 设计模式的征途—20.备忘录(Memento)模式

    相信每个人都有后悔的时候,但是人生并无后悔药,有些错误一旦发生就无法再挽回,有些事一旦错过就不会再重来,有些话一旦说出口也就不可能再收回,这就是人生.为了不让自己后悔,我们总是需要三思而后行.这里我们 ...

  3. 分享:SringBuffer与String的区别

    ·作为Java中最为基础的部分,在Java的学习过程中,就一定会学习到字符串,其中String类作为字符串.并且在Java所有的程序中是使用字符串都是使用String类去实现. 两者存在一定的通性,都 ...

  4. poj 1182 食物链 带权并查集

    食物链是并查集的进阶运用的一道非常经典的题目. 题目如下: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A, ...

  5. js中匿名函数

    今天碰到一道题,里面既包含了匿名函数的知识,也包含了预编译,函数的传参(形参),感觉迷迷糊糊的,所以想着做个总结. var foo={n:1}; (function(foo){ console.log ...

  6. 纹理混合遇到的问题 pre-multiplying OpenGL Android iOS

    纹理混合遇到的问题 pre-multiplying OpenGL Android iOS Alpha-blending pre-multiplying of texture OpenGL Androi ...

  7. JavaSE二次学习之标识符和编程命名相关的内容

    前段时间阿里开源了<阿里巴巴 JAVA 开发手册>,里面详细叙述了有关编程命名.sql规约.工程规约等内容,作为一个初学者,只讨论一下-编程规约-的部分. 这几天又重新回去看了看JavaS ...

  8. Java面向对象-方法的值传递和引用传递

    Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』  博客类别:Java核心基础  阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...

  9. 在htnl中,<input tyle = "text">除了text外还有几种种新增的表单元素

    input标签新增属性       <input   list='list_t' type="text" name='user' placeholder='请输入姓名' va ...

  10. Project 4:Longest Ordered Subsequence

    Problem description A numeric sequence of ai is ordered if a1 < a2 < - < aN. Let the subseq ...