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源文件中是否必须要有一个public类?

    java源文件中不必有一个public类,如果没有public类的话,那么文件名可以是任意合法名称,且编译完成之后如果该源文件中有多个独立的类,则会生成多个对应的.class文件.

  2. tomcat-users.xml配置Manager登陆用户

    添加用来登陆tomcat-manager的用户 <tomcat-users> <!-- NOTE: By default, no user is included in the &q ...

  3. 【Centos7】卸载OpenJDK

    一般情况下,centos会自带OpenJDK,Hadoop的运行环境要求自己配置JRE,但在home下配置好了JRE后,使用java -version仍然看到OpenJDK,原因是系统根据$PATH路 ...

  4. Android 音视频开发(二):使用 AudioRecord 采集音频数据并保存到文件

    版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/7457321.html 一.AudioRecord API详解 AudioRecord是Android系统提 ...

  5. # hadoop入门第六篇:Hive实例

    前言   前面已经讲了如何部署在hadoop集群上部署hive,现在我们就做一个很小的实例去熟悉HIVE QL.使用的数据是视频播放数据包括视频编码,播放设备编码,用户账号编码等,我们在这个数据基础上 ...

  6. Flask01 初识flask、flask配置

    1 什么是flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 百度百科:点击前往 中文文档: ...

  7. jQuery方法输出有几个checkbox框被选中

    每选中一个多选框,输出有多少个选中 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  8. 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

    异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...

  9. TC358775XBG:MIPI DSI转双路LVDS芯片简介

    TC358775XBG是一颗MIPI DSI转双路LVDS芯片,通信方式:IIC/MIPI command mode,分辨率1920*1200,封装形式:BGA64.

  10. 安装lvs过程

    linux我是最小化安装的mini,安装完成后搭建本地yum,首先安装Development Tools开发工具组 1)在各服务器上修改主机名: [root@LVS1 ~]# hostname LVS ...