maven - 从Maven迁移到Gradle:WAR构建任务的 “gradle build”失败

标签 maven dependencies war gradle

我正在尝试将pom.xml配置重写为gradle脚本。关于pom依赖项的部分如下所示:

<dependencies>
    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework-version}</version>
        <exclusions>
            <!-- Exclude Commons Logging in favor of SLF4j -->
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
             </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency> 
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

    <!-- Spring security -->    
    <dependency> 
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-core</artifactId>  
        <version>${spring.security.version}</version> 
    </dependency> 
    <dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-ldap</artifactId>  
        <version>${spring.security.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-config</artifactId>  
        <version>${spring.security.version}</version>  
    </dependency> 
    <dependency> 
          <groupId>org.springframework.security</groupId>  
          <artifactId>spring-security-web</artifactId>  
          <version>${spring.security.version}</version> 
    </dependency> 
    <dependency>
         <groupId>org.springframework.security</groupId>  
         <artifactId>spring-security-taglibs</artifactId>  
        <version>${spring.security.version}</version> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-acl</artifactId> 
        <version>${spring.security.version}</version> 
    </dependency>

    <!-- Tiles dependancies -->
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-api</artifactId>
        <version>2.1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-core</artifactId>
        <version>2.1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-jsp</artifactId>
        <version>2.1.4</version>
    </dependency>
    <dependency>
    <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-servlet</artifactId>
        <version>2.1.4</version>
    </dependency>

    <!-- AspectJ -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${org.aspectj-version}</version>
    </dependency>

    <!-- MySQL database driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.19</version>
    </dependency>

    <!-- PostgreSQL database driver -->
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901.jdbc4</version>
    </dependency>

    <!-- Required by databases -->
    <dependency> 
        <groupId>org.apache.derby</groupId> 
         <artifactId>derbyclient</artifactId> 
        <version>10.9.1.0</version> 
    </dependency> 
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

    <!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j-version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j-version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${org.slf4j-version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.jms</groupId>
                <artifactId>jms</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jdmk</groupId>
                <artifactId>jmxtools</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jmx</groupId>
                <artifactId>jmxri</artifactId>
            </exclusion>
        </exclusions>
        <scope>runtime</scope>
    </dependency>

    <!-- @Inject -->
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

    <!-- Servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- Validation -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
    </dependency>

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.1.Final</version>
    </dependency>

    <!-- DOM4j -->
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>

     <!-- Commons -->        
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.3</version>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-digester</groupId>
        <artifactId>commons-digester</artifactId>
        <version>2.1</version>
    </dependency>
    <dependency>
         <groupId>commons-fileupload</groupId>
         <artifactId>commons-fileupload</artifactId>
         <version>1.2.2</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>

     <!-- Language recognizer required by Spring -->
    <dependency>
        <groupId>antlr</groupId>
        <artifactId>antlr</artifactId>
        <version>2.7.7</version>
    </dependency>

    <!-- Test -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.7</version>
        <scope>test</scope>
    </dependency>        
</dependencies>

目前,gradle脚本负责依赖性的部分如下所示:
//----------------------------------------------------------------------------
//                    SERVER'S DEPENDENCIES' CONFIGURATION
//----------------------------------------------------------------------------

configure(serverProjects) {
    repositories {
        mavenCentral()
        maven { url 'http://repository.jboss.org/nexus/content/groups/public' }
    }
}

// Spring Framework:
def springVersion = '3.1.0.RELEASE'
def springContext = "org.springframework:spring-context:${springVersion}"
def springMVC     = "org.springframework:spring-webmvc:${springVersion}"
def springAOP     = "org.springframework:spring-aop:${springVersion}"
def springORM     = "org.springframework:spring-orm:${springVersion}"
def springJDBC    = "org.springframework:spring-jdbc:${springVersion}"


// Spring Security:
def springSecurityVersion = '3.1.2.RELEASE'
def springSecurityCore    = "org.springframework.security:spring-security-core:${springSecurityVersion}"
def springSecurityLDAP    = "org.springframework.security:spring-security-ldap:${springSecurityVersion}"
def springSecurityConfig  = "org.springframework.security:spring-security-config:${springSecurityVersion}"
def springSecurityWeb     = "org.springframework.security:spring-security-web:${springSecurityVersion}"
def springSecurityTaglibs = "org.springframework.security:spring-security-taglibs:${springSecurityVersion}"
def springSecurityACL     = "org.springframework.security:spring-security-acl:${springSecurityVersion}"


// Tiles:
def tilesVersion = '2.1.4'
def tilesCore    = "org.apache.tiles:tiles-core:${tilesVersion}"
def tilesAPI     = "org.apache.tiles:tiles-api:${tilesVersion}"
def tilesJSP     = "org.apache.tiles:tiles-jsp:${tilesVersion}"


// AspectJ:
def aspectJVersion = '1.6.9'
def aspectJ        = "org.aspectj:aspectjrt:${aspectJVersion}"


// Databases:
def apacheDerbyVersion = '10.9.1.0'
def apacheDerby        = "org.apache.derby:derbyclient:${apacheDerbyVersion}"

def mySQLVersion = '5.1.19'
def mySQL        = "mysql:mysql-connector-java:${mySQLVersion}"

def postgreSQLVersion = '9.1-901.jdbc4'
def postgreSQL        = "postgresql:postgresql:${postgreSQLVersion}"


// Logging:
def slf4jVersion = '1.5.10'
def slf4jAPI     = "org.slf4j:slf4j-api:${slf4jVersion}"
def slf4jJCL     = "org.slf4j:jcl-over-slf4j:${slf4jVersion}"
def slf4jLog4J   = "org.slf4j:slf4j-log4j12:${slf4jVersion}"

def log4JVersion = '1.2.15'
def log4J        = "log4j:log4j:${log4JVersion}"

// Javax:
def javaxServletAPIVersion = '2.5'
def javaxServletAPI        = "javax.servlet:servlet-api:${javaxServletAPIVersion}"

def javaxJspApiVersion     = '2.1'
def javaxJspApi            = "javax.servlet.jsp:jsp-api:${javaxJspApiVersion}"

def javaxJSTLVersion       = '1.2'
def javaxJSTL              = "javax.servlet:jstl:${javaxJSTLVersion}"

def javaxInjectVersion     = '1'
def javaxInject            = "javax.inject:javax.inject:${javaxInjectVersion}"

def javaxValidationVersion = '1.0.0.GA'
def javaxValidation        = "javax.validation:validation-api:${javaxValidationVersion}"


// Hibernate:
def hibernateCoreVersion      = '4.1.7.Final'
def hibernateCore             = "org.hibernate:hibernate-core:${hibernateCoreVersion}"

def hibernateValidatorVersion = '4.3.0.Final'
def hibernateValidator        = "org.hibernate:hibernate-validator:${hibernateValidatorVersion}"

def hibernateJPAVersion       = '1.0.1.Final'
def hibernateJPA              = "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:${hibernateJPAVersion}"


// dom4j:
def dom4JVersion = '1.6.1'
def dom4J        = "dom4j:dom4j:${dom4JVersion}"


// antlr:
def antlrVersion = '2.7.7'
def antlr        = "antlr:antlr:${antlrVersion}"


// commons:
def commonsBeanUtilsVersion   = '1.8.3'
def commonsBeanUtils          = "commons-beanutils:commons-beanutils:${commonsBeanUtilsVersion}"

def commonsCollectionsVersion = '3.2.1'
def commonsCollections        = "commons-collections:commons-collections:${commonsCollectionsVersion}"

def commonsDigesterVersion    = '2.1'
def commonsDigester           = "commons-digester:commons-digester:${commonsDigesterVersion}"

def commonsFileUploadVersion  = '1.2.2'
def commonsFileUpload         = "commons-fileupload:commons-fileupload:${commonsFileUploadVersion}"

def commonsIOVersion          = '2.3'
def commonsIO                 = "commons-io:commons-io:${commonsIOVersion}"

def commonsLangVersion        = '2.6'
def commonsLang               = "commons-lang:commons-lang:${commonsLangVersion}"

def commonsLoggingVersion     = '1.1.1'
def commonsLogging            = "commons-logging:commons-logging:${commonsLoggingVersion}"


// JUnit4:
def jUnitVersion = '4.7'
def jUnit        = "junit:junit:${jUnitVersion}"

project(':WARProject') {
    dependencies {
        // Spring Framework:
        compile(springContext) {
            exclude group: 'commons-logging', module: 'commons-logging'
        }
        compile(
            springMVC,    springAOP,    springORM,     springJDBC
        )

        // Spring Security:
        compile(
            springSecurityCore,    springSecurityLDAP,        springSecurityConfig,
            springSecurityWeb,    springSecurityTaglibs,    springSecurityACL
        )

        // Tiles:
        compile(
            tilesCore, tilesAPI, tilesJSP
        )

        // AspectJ:
        compile(aspectJ)

        // Databases:
        compile(
            apacheDerby, mySQL, postgreSQL
        )

        // Logging:
        compile(slf4jAPI)
        runtime(
            slf4jJCL, slf4jLog4J
        )
        runtime(log4J) {
            exclude group: 'javax.mail',   module: 'mail'
            exclude group: 'javax.jms',    module: 'jms'
            exclude group: 'com.sun.jdmk', module: 'jmxtools'
            exclude group: 'com.sun.jmx',  module: 'jmxri'
        }

        // Javax:
        compile(
            javaxInject,        javaxValidation,        javaxJSTL
        )
        providedCompile(
            javaxServletAPI,    javaxJspApi
        )

        // Hibernate:
        compile(
            hibernateCore, hibernateValidator, hibernateJPA
        )

        // dom4j:
        compile(dom4J)

        // antlr:
        compile(antlr)

        // commons:
        compile(
            commonsBeanUtils,    commonsCollections,    commonsDigester,
            commonsFileUpload,    commonsIO,            commonsLang,
            commonsLogging
        )

        // JUnit:
        testCompile(
            jUnit
        )
    }
}

当我尝试生成WAR文件时,我收到org.apache.log4j.Logger软件包不存在的信息。如果我将runtime替换为compile,则会收到Artifact 'javax.jms:jms:1.1@jar' not found错误,好像exclude子句被完全忽略了。
providedRuntimeprovidedCompile的结果分别与runtimecompile相同。

如何修改脚本以成功构建WAR文件?

编辑:

显示的gradle :WARProject:dependencies:
...
+--- org.slf4j:slf4j-log4j12:1.5.10 [default]
|    +--- org.slf4j:slf4j-api:1.5.10 [compile,runtime,master] (*)
|    \--- log4j:log4j:1.2.15 [compile,runtime,master]
|         +--- javax.mail:mail:1.4 [compile,master,runtime]
|         |    \--- javax.activation:activation:1.1 [compile,master,runtime]
|         +--- javax.jms:jms:1.1 [compile,master,runtime]
|         +--- com.sun.jdmk:jmxtools:1.2.1 [compile,master,runtime]
|         \--- com.sun.jmx:jmxri:1.2.1 [compile,master,runtime]

这意味着gradle并没有排除这些依赖关系(这是javax.jms:jms出现的唯一位置)。我尝试在定义末尾添加@jar,以及在排除块中添加transitive = false-没有结果。我还应该尝试什么?

最佳答案

实际上,版本1.2.15的log4j缺少maven的许可问题依赖性。并建议使用log4j的1.2.16版本。

尝试:

def log4JVersion = '1.2.15'
def log4J        = "log4j:log4j:${log4JVersion}"

=>
def log4JVersion = '1.2.16'
def log4J        = "log4j:log4j:${log4JVersion}"

或者,如果gradle文件中不需要它们,则可以排除jmx和jdmk。我看到您在pom中排除了它们,但是gradle文件中缺少排除声明。

尝试添加以下内容:
configurations {
   all*.exclude group: 'javax.jms', module: 'jms'
   all*.exclude group: 'com.sun.jdmk', module: 'jmxtools'
   all*.exclude group: 'com.sun.jmx', module: 'jmxri'
   published
}

干杯!

关于maven - 从Maven迁移到Gradle:WAR构建任务的 “gradle build”失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295495/

相关文章:

java - 调用RequestMapping "twice"

maven-2 - 使用 Maven 2 管理依赖关系

java - 在从客户端获取请求之前做一些事情,tomcat war

inheritance - 声明为依赖项或父项

c# - 什么术语用于描述两个类何时相互依赖?

scala - 如何用sbt构建一个简单的war文件?

java - 使用配置部署 WAR 文件

java - maven在java中生成Web服务

java - 使用 Maven 运行测试显示类路径问题

java - Maven - 使用 JDK 7 为 JVM 5 编译