java - Gradle - 同一库的 2 个不同版本

标签 java servlets gradle

我正在使用 Gradle 构建一个使用 Hadoop 和 Jetty 的项目。我使用与 Java Servlets 3.0 兼容的较新版本的 Jetty。

Hadoop 似乎使用与 Java Servlet 3.0 兼容的旧版本 Jetty。

当我尝试在 Web 服务器上运行某些方法时,会引发 NoSuchMethodError。我相信这是因为正在使用旧版本的 Servlets api。

理想情况下,我想指定 Hadoop 使用的 Jetty 依赖于 servlet API 2.5,而我的 Jetty 服务器使用 3.0。

如果这是不可能的,我想指定两者都使用 3.0。

我的整个build.gradle:

        apply plugin: 'java'

    sourceCompatibility = 1.8
    version = '1.0'

    repositories {
        mavenCentral()
        jcenter() // for a solr dependency
    }

dependencies {
    //testCompile group: 'junit', name: 'junit', version: '4.11'


    compile group: 'org.eclipse.jetty.aggregate', name:'jetty-all-server', version:'8.1.16.v20140903'

    compile group:'org.codehaus.jackson', name:'jackson-core-asl',version: '1.9.13'
    compile group:'org.codehaus.jackson', name:'jackson-mapper-asl',version: '1.9.13'
    compile group:'org.apache.commons', name: 'commons-csv', version: '1.1'

    compile group:'org.apache.lucene', name:'lucene-core', version:'5.0.0'
    compile group:'org.apache.solr', name: 'solr-core', version:'5.0.0'

    compile group:'org.apache.hadoop', name:'hadoop-core', version:'1.2.1'

    compile group:'javax.servlet', name:'javax.servlet-api', version:'3.0.1'
}

project.getConfigurations().all { config->
    config.resolutionStrategy.eachDependency
                        {DependencyResolveDetails details->

                            if (details.requested.group == 'org.mortbay.jetty' && details.requested.name == "servlet-api")
                            {
                                details.requested.group="javax.servlet"
                                details.requested.name="javax.servlet-api"
                                details.requested.version="3.0.1"
                                System.out.println(details.requested.properties);
                            }
                        }
}

jar
        {
            doFirst
                    {



                        def serviceDir = file("$buildDir/META-INF/services")
                        serviceDir.deleteDir()
                        serviceDir.mkdirs()

                        for (file in configurations.runtime){
                            zipTree(file).matching{ include 'META-INF/services/*'}.each {
                                f-> new File(serviceDir, f.name) <<f.getText("UTF-8")
                            }
                        }
                    }

            manifest
                    {
                        attributes 'Main-Class': 'Main'
                    }

            from (configurations.compile.collect {it.isDirectory() ?it:zipTree(it) })
                    {
                        exclude 'META-INF/**'
                    }


            from fileTree(buildDir).matching{ include 'META-INF/services/*'}
        }

最佳答案

清理你的build.gradle:

apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_8
version = '1.0'

repositories {
    jcenter()
}

dependencies {
    compile 'org.eclipse.jetty.aggregate:jetty-all-server:8.1.16.v20140903'
    compile 'org.codehaus.jackson:jackson-core-asl:1.9.13'
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
    compile 'org.apache.commons:commons-csv:1.1'
    compile 'org.apache.lucene:lucene-core:5.0.0'
    compile 'org.apache.solr:solr-core:5.0.0'
    compile 'org.apache.hadoop:hadoop-core:1.2.1'
    compile 'javax.servlet:javax.servlet-api:3.0.1'
}

检查jetty配置:

javax.servlet.http.HttpServletRequest.getParts()仅从 Servlet API 3.0 开始可用

要检查的事项:

  • 确保您正在运行 Jetty 8 或 Jetty 9
  • 确保您的 WEB-INF/web.xml 配置为使用 Servlet API 3.0
  • 确保您的构建工具使用 servlet-api 3.0 jar。
  • 确保您的 WEB-INF/lib 目录中有相同的 servlet api 3.0 jar。

来源:Facing java.lang.NoSuchMethodError: HttpServletRequest.getParts()Ljava/util/Collection

关于java - Gradle - 同一库的 2 个不同版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29809456/

相关文章:

java - 我的最后一个java问题即使是我的教授也无法解决的问题

gradle - Java 的项目范围属性

gradle - 在buildscript闭包中访问项目的额外属性

java - 在方法中实现按钮 onClickListener

Java - 具有多级类的列表集合 - 仅循环最后一个成员 - .stream() .forEach() .for()

java.sql.SQLException : Illegal operation on empty result set. dor select 语句

java - 将具有通用配置的 gradle 插件应用到所有项目

java - 初级Java : go back to start after failed try (try contains for loop)

java - 知识产权共享

jsp 上的 javax.el.PropertyNotFoundException 错误