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. IPV6与IPV4的区别

    IPv4协议的地址长度是32位,IPv6协议的地址长度是128位. 1.表示方式 IPv4地址表示为点分十进制格式,32位的地址分成4个8位分组,每个8位以十进制数显式,中间用点号分隔. 而IPv6采 ...

  2. 利用pyinotify监控文件内容,像tailf命令但比它更强

    Linux的tail/tailf命令使用了内核提供的inotify功能,下面的Python例子也使用inotify实现比tail/tailf更强的监控文件功能. watchfile.py #!/usr ...

  3. 【Spring】装配Bean 组件扫描

    实现自动装配需要用注解:注解分为 spring规范和java规范 ,java规范需要引入javax.inject 包 ,使用maven,直接引入. 从中可以看到 @Named @Inject属于jav ...

  4. Leetcode - Letter Combination Of A Phone Number

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  5. 《HelloGitHub》第 17 期

    公告 本月 hellogitub.com 动态 服务器迁移到了国内,国内浏览速度有了质的飞跃. 代码重构 项目 运行更加简单,直接 clone.执行安装依赖命令.运行 上线了"我的收藏&qu ...

  6. spring学习笔记1

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAATQAAAEBCAIAAAB5VM7WAAAgAElEQVR4nOy9Z3gc13n3zZT3efPESZ

  7. 用户管理-linux基础

    用户管理 useradd -u -g -G(附加组) ,-c -d -s -r(创建系统用户)   -M (不创建家目录)    思考:删除user1用户家目录,如何还原.        可以#cp ...

  8. Form表单提交,Ajax请求,$http请求的区别

    做过前端同学想必都避免不了要和后台server打交道.而以下这三种与后台交互的方式想必大家都不陌生. Form表单提交,Ajax请求,Angular的$http请求 以前一直搞不清楚什么时候应该用哪种 ...

  9. Linux入门练习

    1.echo是用于终端打印的基本命令: 1.1echo默认将一个换行符追加到输出文本的尾部. 1.2 echo中转义换行符 如需使用转义序列,则采用echo -e "包含转义序列的字符串&q ...

  10. Tomcat利用Redis存储Session

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt269 如果英文不错的看,建议直接看官网吧,官网写的挺清楚.下面的内容是转载的 ...