Tomcat 运行后 class 文件不编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat 运行后 class 文件不编译相关的知识,希望对你有一定的参考价值。
参考技术A 问题背景 :
之前把 idea 的版本做了一次升级,结果发现自己项目启动 Tomcat 后报了一个错误,实例化 Servlet 类 [com.yafnds.servlet.HelloServlet] 异常,具体错误格式可以查看这个文章:
【Java】tomcat 500错误解决系列一:实例化Servlet错误
主要内容为:
但是,我在试了网上的很多方法后发现,我这里找不到class文件的原因是Tomcat运行时根本没有编译class文件,如图:(编译后的target)
实际的出错原因 :父模块中出现了子模块的内容。
(出错时没有截图,后来试了好几次,发现没法复现bug,所以就没有截图了。如有需要,可以查看这篇文章( 解决:多模块项目:复制已有模块进行结构修改时报错:Module "xxx" must not contain source root "...\\xxx\\src\\main\\java". ),可以说是出现本次问题的根本原因)
解决办法:
打开该项目的 Project Structure 把父模块中不属于自己的特殊目录统统删掉,****点右侧的X即可
gradles理解和文件配置
gradle
gradle tasks :查看所有的taske命令
bootJar:打包,讲项目的所有依赖和主工程代码打包,一个可直接执行的一个包,不需要tomcat运行
gradle使用bootjar打包后后,解压出来的三个目录
BOOT-INF:
? classes:存放java文件编译后的class文件
? lib:所有的lib依赖包
META-INF:
? MANIFEST.MF:清单文件,描述当前项目可执行的一些信息
org/
? springframework/
? boot/
? loader/: 打包jar包,没有显现的加入在第三方jiar包中,默认通过网络拉取下载,loader文件中JarLauncher.class文件中设置了jar包运行时的入口和打包 后文件的结构(定义了BOOT-INF,META-INF中放什么数据)
public class JarLauncher extends ExecutableArchiveLauncher {
private static final String DEFAULT_CLASSPATH_INDEX_LOCATION = "BOOT-INF/classpath.idx";
static final EntryFilter NESTED_ARCHIVE_ENTRY_FILTER = (entry) -> {
return entry.isDirectory() ? entry.getName().equals("BOOT-INF/classes/") : entry.getName().startsWith("BOOT-INF/lib/");
};
public JarLauncher() {
}
protected JarLauncher(Archive archive) {
super(archive);
}
protected ClassPathIndexFile getClassPathIndex(Archive archive) throws IOException {
if (archive instanceof ExplodedArchive) {
String location = this.getClassPathIndexFileLocation(archive);
return ClassPathIndexFile.loadIfPossible(archive.getUrl(), location);
} else {
return super.getClassPathIndex(archive);
}
}
private String getClassPathIndexFileLocation(Archive archive) throws IOException {
Manifest manifest = archive.getManifest();
Attributes attributes = manifest != null ? manifest.getMainAttributes() : null;
String location = attributes != null ? attributes.getValue("Spring-Boot-Classpath-Index") : null;
return location != null ? location : "BOOT-INF/classpath.idx";
}
protected boolean isPostProcessingClassPathArchives() {
return false;
}
protected boolean isSearchCandidate(Entry entry) {
return entry.getName().startsWith("BOOT-INF/");
}
protected boolean isNestedArchive(Entry entry) {
return NESTED_ARCHIVE_ENTRY_FILTER.matches(entry);
}
public static void main(String[] args) throws Exception {
(new JarLauncher()).launch(args);
}
}
配置文件说明
//相当于plugins{}
//开发语言
apply plugin :"java"
// 打包方式
apply plugin :"war"
//下载idea相关插件
apply plugin: "idea"
//maven的相关插件
apply plugin: "maven"
apply plugin: ‘org.akhikhl.gretty‘
//apply from: ‘https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin‘
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ‘org.akhikhl.gretty:gretty:2.0.0‘
}
}
repositories {
mavenCentral()
}
if (!project.plugins.findPlugin(org.akhikhl.gretty.GrettyPlugin))
project.apply(plugin: org.akhikhl.gretty.GrettyPlugin)
//配置服务器相关属性 tomcat
/*buildscript {
repositories {
mavenCentral()
}
dependencies{
classpath ‘org.zkhikhl.gretty:gretty:2.0.0‘
}
}
repositories {
mavenCentral()
}
if (!project.plugins.findPlugin(org.akhikhl.gretty.GretyPlugin))
project.apply (plugin: org.akhikhl.gretty.GretyPlugin)
//配置tomcat的属性*/
gretty {
// 端口号
httpPort = 8080
// 项目名
contextPath = ‘/mygradle‘
host = ‘localhost‘
httpEnabled = true
// servlet的容器
servletContainer = ‘tomcat8‘
// 热部署
scanInterval = 1
// 检测是否发生修改,修改立刻生效
fastReload = true
// 日志级别
loggingLevel = ‘DEBUG‘
// 日治在哪里显示,在控制台显示
consoleLogEnabled = true
// ... many more properties
//调试配置 监听端口 需要在Run-->Edit-->添加remote-->修改监听端口 默认5005
//
debugPort = 8888
debugSuspend = true
}
/*
plugins {
//开发语言
id ‘java‘
// 打包方式
id ‘war‘
}*/
group ‘com.zhang‘
version ‘1.0-SNAPSHOT‘
//指定java的jdk
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
// 依赖下载仓库:这里是maven仓库
mavenCentral()
}
//指定依赖包下载私服
/*dependencies{
repositories {
maven{
url:制定的ip地址
}
}
}*/
//jar包
dependencies {
testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.12‘
}
//设置项目的各个阶段的编码
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
[compileJava,javadoc,compileTestJava]*.options*.encoding ="UTF-8"
以上是关于Tomcat 运行后 class 文件不编译的主要内容,如果未能解决你的问题,请参考以下文章