引起:java.lang.NoSuchMethodError:org.apache.tomcat.util.res.StringManager.getManager(Ljava / lang / Class;)

时间:2018-05-16 12:25:07

标签: spring-boot gradle deployment tomcat7

尝试部署war服务器时出现以下错误。

服务器tomcat版本:7.0.57 服务器java版本:1.7

在intellij中使用gradle工具(bootrepackage)创建了战争。

在开发过程中,一切都可以在intellij中找到。

  

引起:java.lang.NoSuchMethodError:org.apache.tomcat.util.res.StringManager.getManager(Ljava / lang / Class;)Lorg / apache / tomcat / util / res / StringManager;

的build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
   dependencies {
       classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.10.RELEASE")
    }
}
group 'batch'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'war'

bootRun {
    addResources = true
}

war {
    baseName = 'Batch'
    version =  '0.1.0'
    manifest {
        attributes 'Main-Class': 'src.main.java.com.Application'
    }
}

jar {
    manifest {
        attributes 'Main-Class': 'src.main.java.com.Application'
    }
}

sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.1.10.RELEASE'
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.24'
    compile group: 'org.json', name: 'json', version: '20180130'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.1.10.RELEASE'
    compile group: 'javax.servlet', name: 'jstl', version: '1.2'
    compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '7.0.82'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat', version: '1.1.10.RELEASE'
    //compile group: 'net.sourceforge.tess4j', name: 'tess4j', version: '4.0.2'
    //compile group: 'org.apache.poi', name: 'poi', version: '3.9'
}

1 个答案:

答案 0 :(得分:0)

在您的初始问题中,您混合了至少3个不同版本的Spring Boot。 1.1.10,1.4.0和1.5.6。永远不要混合不同版本的框架(无论框架),因为这将导致有趣的结果。

接下来,您正试图通过自己管理依赖项来超越Spring Boot插件。让Spring Boot(和插件)为他们做些什么。

tomcat-jasper依赖关系来判断您是否尝试将JSP与Spring Boot一起使用(尽管不推荐)。

首先让我们修复依赖关系管理并使用Spring Boot版本。

注意:我使用最新的Spring Boot 1.x版本随意使用旧版本。

buildscript {
    repositories {
        mavenCentral()
    }
   dependencies {
       classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.13.RELEASE")
    }
}

group 'batch'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'org.springframework.boot'

接下来让我们修复你想要使用的tomcat版本(参见how to use tomcat7)。

ext['tomcat.version']='7.0.57'

现在清理依赖项,以便让spring boot管理依赖项。由于您要构建WAR归档文件,因此spring-boot-starter-tomcat以及其他tomcat依赖项应该是providedRuntime作用域依赖项(请参阅。Packaging war file)。

dependencies {
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa'
    providedRuntime group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat'

    compile group: 'mysql', name: 'mysql-connector-java'
    compile group: 'org.json', name: 'json', version: '20180130'
    compile group: 'javax.servlet', name: 'jstl', version: '1.2'

    providedRuntime group:'org.apache.tomcat', name:'tomcat-juli', version:property('tomcat.version')
    providedRuntime group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: property('tomcat.version')
}

您还应该能够删除jar任务,因为Spring Boot会对这些任务进行控制(和禁用)。您可能希望使用springBoot部分来配置main类。

这一切应该导致或多或少的以下build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
   dependencies {
       classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.13.RELEASE")
    }
}
group 'batch'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'org.springframework.boot'

sourceCompatibility = 1.7
targetCompatibility = 1.7

ext['tomcat.version']='7.0.57'

bootRun {
    addResources = true
}

springBoot {
  mainClass = com.Application
}

war {
    baseName = 'Batch'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa'
    providedRuntime group: 'org.springframework.boot', name: 'spring-boot-starter-tomcat'

    compile group: 'mysql', name: 'mysql-connector-java'
    compile group: 'org.json', name: 'json', version: '20180130'
    compile group: 'javax.servlet', name: 'jstl', version: '1.2'

    providedRuntime group:'org.apache.tomcat', name:'tomcat-juli', version:property('tomcat.version')
    providedRuntime group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: property('tomcat.version')
}

哪个应该给你一个可执行和可部署的战争。在部署到要使用的tomcat服务器时,tomcat jar不再位于类路径上。