简短版
当我更改应用中的资源,然后尝试热部署它们时,文件将被删除而不是从target/
目录更新,我不明白为什么。
长版
我有一个Java 8 + Tomcat 8 + Spring Boot + Thymeleaf项目,我用完了IntelliJ。当我更改文件(例如src/main/resources/static/css
目录中的CSS文件,并运行Update Resources
或Update classes 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
,这似乎是我的真正的 catalina基础的非工作克隆,我到处都得到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部署,其中包含一个包含库存conf/server.xml
和conf/web.xml
的自定义catalina基础,以及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>
我不确定这个问题究竟值得说些什么,尽管它并不像我提供的那样有用。如果我应该添加任何信息,请添加评论。
答案 0 :(得分:0)
我猜你正在使用maven插件。
默认情况下,运行应用程序时,任何src / main / resources文件夹都将添加到应用程序类路径中,并且将删除在target / classes中找到的任何副本。这允许热刷新资源,这在开发Web应用程序时非常有用。例如,您可以处理HTML,CSS或JavaScipt文件,并立即查看更改,而无需重新编译应用程序。它也是一种允许前端开发人员无需下载和安装Java IDE即可工作的有用方法。
如果您可以直接从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>
http://docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html
答案 1 :(得分:0)
我必须在IDEA中明确提供src/main/resources
作为运行时Module Dependency,然后才能对我的网络文件(Thymeleaf模板,静态文件等)进行热交换。
更新 - 虽然明确设置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;
}