Maven构建后class、jar、war等文件输出目录
Maven默认文件输出目录在根目录的target目录下,但是可以通过配置进行修改。
- ${project.build.directory}:/target目录。
- ${project.basedir}:pom.xml所在目录。
class文件输出位置修改
通过pom.xml增加如下配置
<build>
<!-- ... -->
<outputDirectory>${project.basedir}/src/main/webapp/WEB-INF/classes/</outputDirectory>
<!-- ... -->
</build>
其他配置项
<build>
<!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<sourceDirectory />
<!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 -->
<scriptSourceDirectory />
<!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
<testSourceDirectory />
<!--被编译过的应用程序class文件存放的目录。 -->
<outputDirectory />
<!--被编译过的测试class文件存放的目录。 -->
<testOutputDirectory />
</build>
jar文件输出位置修改
<build>
<!-- ... -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- 指定打包的jar包输出路径 -->
<outputDirectory>D:\test</outputDirectory>
<!--不打入jar包的文件类型或者路径 -->
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
<exclude>**/*.yml</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
</excludes>
</configuration>
</plugin>
<!-- ... -->
</build>
war文件输出位置修改
<build>
<!-- ... -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<!-- 指定打包的jar包输出路径 -->
<outputDirectory>D:\test</outputDirectory>
<!--不打入jar包的文件类型或者路径 -->
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
<exclude>**/*.yml</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
</excludes>
</configuration>
</plugin>
<!-- ... -->
</build>
IDEA项目配置编译输出目录
Proeject Structure -> Modules -> Paths -> Output path
Artifacts 项目打包方式
这一步实际是将maven与项目便也好的代码,按照实际部署情况进行打包。
IDEA 内tomcat配置后,实际运行项目地址
特殊说明
- 热部署仍需要安装Jrebel插件。
- 项目或maven指定编译后代码输出目录后,当项目未运行时,因IDEA内tomcat默认指向/target目录下项目,导致代码不生效,需要rebuild artifacts。
- 项目或maven指定编译后代码输出目录后,当项目运行时,因Jrebel热部署生效,应该是实时改变了JVM内运行的代码,所以代码可以生效。
- Run/Debug Configurations内,最好开启Build Project、Build Artifact配置(稳定,但是速度慢)。
遗留问题
- Jrebel热部署原理仍需要探索。
- 项目未运行时,编译后少量代码时,有没有不使用rebuild artifacts方式(耗时太久)。