Tomcat &引用;更新资源“;在IntelliJ中,从目标目录删除更新的文件

Tomcat &引用;更新资源“;在IntelliJ中,从目标目录删除更新的文件,tomcat,intellij-idea,spring-boot,thymeleaf,tomcat8,Tomcat,Intellij Idea,Spring Boot,Thymeleaf,Tomcat8,短版 当我更改应用程序中的资源,然后尝试热部署它们时,文件将从target/目录中删除而不是更新,我不明白为什么 长版本 我有一个Java8+Tomcat8+SpringBoot+Thymeleaf项目,我的IntelliJ快用完了。当我更改文件时,例如src/main/resources/static/CSS目录中的CSS文件,并运行updateresources或updateclasses and resources,文件将从target/classes/static/CSS中删除,而不是更

短版

当我更改应用程序中的资源,然后尝试热部署它们时,文件将从
target/
目录中删除而不是更新,我不明白为什么

长版本

我有一个Java8+Tomcat8+SpringBoot+Thymeleaf项目,我的IntelliJ快用完了。当我更改文件时,例如
src/main/resources/static/CSS
目录中的CSS文件,并运行
updateresources
updateclasses and resources
,文件将
target/classes/static/CSS
中删除,而不是更新。Tomcat日志中没有打印关于文件的任何内容,IntelliJ日志(在
~/Library/logs/IntelliJIdea13/idea.log
中)中没有打印关于删除文件的任何内容。。。它就这样消失了

Tomcat 8被设置为具有以下配置的外部应用程序服务器(不是内置的Spring Boot嵌入式服务器)。我在IntelliJ运行配置设置中定制的唯一一件事是将
CATALINA_BASE
指定为与“Tomcat BASE”相同的值,如下所示:

Tomcat Home: /usr/local/tomcat8
Tomcat Base: /path/to/my/catalina/base
Java Env Vars: CATALINA_BASE=/path/to/my/catalina/base
。。。如果我不这样做,CATALINA_BASE将设置为
/Users/me/Library/Caches/IntelliJIdea13/tomcat/Unnamed_demo_app
,这似乎是我的realCATALINA BASE的一个非工作克隆,我到处都能看到404。这可能是一个红鲱鱼在这里,或神秘的关键

额外的,可能是无用的信息

下面是
idea.log
中的相关(但无趣)输出:

INFO - ij.compiler.impl.CompileDriver - COMPILATION STARTED (BUILD PROCESS)
INFO - j.compiler.server.BuildManager - BUILDER_PROCESS [stdout]: Build process started. Classpath: /Applications/IntelliJ IDEA 13.app/lib/jps-launcher.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/tools.jar:/Applications/IntelliJ IDEA 13.app/lib/optimizedFileManager.jar:/Applications/IntelliJ IDEA 13.app/lib/ecj-4.3.2.jar
INFO - lij.compiler.impl.CompilerUtil -   COMPILATION FINISHED (BUILD PROCESS); Errors: 0; warnings: 0 took 3709 ms: 0 min 3sec
该应用程序配置为执行WAR部署,带有一个自定义catalina库,其中包含一个库存
conf/server.xml
conf/web.xml
,以及
lib
中提供的各种第三方库

这是我的POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myapp</artifactId>
    <version>0.1-BETA</version>
    <packaging>war</packaging>

    <properties>
        <spring-boot-version>1.2.1.RELEASE</spring-boot-version>
        <spring-version>4.1.4.RELEASE</spring-version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>${spring-boot-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>${spring-boot-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring-boot-version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>dojo</artifactId>
            <version>1.10.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <!-- for equals/hash/toString builder -->
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <!-- Spring/Mail integration -->
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <!-- Spring/Mail integration -->
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring-version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <!-- connection pooling -->
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>2.3.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

4.0.0
com.example
myapp
0.1-BETA
战争
1.2.1.发布
4.1.4.1发布
org.springframework.boot
spring启动程序父级
1.2.1.发布
org.springframework.boot
弹簧启动装置
${spring启动版本}
假如
org.springframework.boot
弹簧启动安全
${spring启动版本}
假如
org.springframework.boot
spring引导启动器数据jpa
${spring启动版本}
假如
mysql
mysql连接器java
5.1.34
假如
org.webjars
道场
1.10.0
假如
org.apache.commons
commons-lang3
3.0.1
假如
javax.mail
邮件
1.4.7
假如
org.springframework
spring上下文支持
${spring版本}
假如
com.zaxxer
希卡里普
2.3.5
假如

除此之外,我不确定这个问题到底有什么值得一提的,尽管我觉得我提供的东西没有什么用处。如果我需要添加任何信息,请添加评论。

我猜您正在使用maven插件

默认情况下,运行应用程序时,任何src/main/resources文件夹都将添加到应用程序类路径中,并且在target/classes中找到的任何重复文件夹都将被删除。这允许对资源进行热刷新,这在开发web应用程序时非常有用。例如,您可以处理HTML、CSS或JavaScipt文件,并且可以在不重新编译应用程序的情况下立即看到更改。它也是一种非常有用的方法,可以让前端开发人员无需下载和安装JavaIDE即可工作

如果你能从IDEA开始应用程序(只运行主类),我会这么做。否则,通过配置插件禁用该功能:

<build>
  ...
  <plugins>
    ...
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>1.2.3.RELEASE</version>
      <configuration>
        <addResources>false</addResources>
      </configuration>
    </plugin>
    ...
  </plugins>
  ...
</build>

...
...
org.springframework.boot

我必须在IDEA中明确提供
src/main/resources
作为运行时,然后才能热交换对web文件(Thymeleaf模板、静态文件等)的更改

Update——虽然显式设置
src/main/resources
仍然感觉像是对我的错误配置的补偿控件,但它确实让我更新了文件。但是,我仍然发现另一个问题,即当我的电子邮件模板打包在Spring Boot jar中时,无法解决,这给了我一个类似以下的错误:

org.thymeleaf.exceptions.TemplateInputException: 
    Error resolving template "foo", template might not exist 
    or might not be accessible by any of the configured Template Resolvers
at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:246)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:924)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:898)
[...]
我有下面的代码,其中有一个前导斜杠。当我被配置为使用外部Tomcat时,前导斜杠并不重要,但是当打包到jar中时,前导斜杠会中断类路径搜索

@Bean
public ClassLoaderTemplateResolver emailTemplateResolver(){
    ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
  //emailTemplateResolver.setPrefix("/templates/mail/");   // <-- The problem!
    emailTemplateResolver.setPrefix("templates/mail/");    // <-- The fix!
    emailTemplateResolver.setSuffix(".html");
    emailTemplateResolver.setTemplateMode("HTML5");
    emailTemplateResolver.setCharacterEncoding("UTF-8");
    emailTemplateResolver.setOrder(1);

    return emailTemplateResolver;
}
@Bean
公共类装入器TemplateResolver emailTemplateResolver(){
ClassLoaderTemplateResolver emailTemplateResolver=新ClassLoaderTemplateResolver();

//emailTemplateResolver.setPrefix(“/templates/mail/”);//我没有使用maven插件,我使用的是外部Tomcat。但是我尝试转换为使用maven插件,我还尝试引入
springloaded
作为依赖项,并尝试左右修改配置,但仍然无法识别
src/main/resources
目录的更改在看到我的更改之前,将其明确添加为“类”运行时模块依赖项。我最终可以在不重新启动Tomcat的情况下进行JS更改。我花了很多时间定义要通过VM选项使用的cataline: