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 文件不编译的主要内容,如果未能解决你的问题,请参考以下文章

tomcat在Eclipse中部署后不生产class文件

tomcat 每次启动编译文件classes 为啥还用ANT进行重新编译? 和maven有啥区别

jsp编译后文件位置在哪里

web项目各个clean

Eclipse Java class修改后的即时编译

JSP更换class文件后,一定要重启Tomcat吗?