Gradle:如何编译使用com.sun.xml.internal.bind。*的类?

时间:2011-10-15 17:38:59

标签: java eclipse maven-2 classpath gradle

我正在将现有项目从ant转换为Gradle。

不幸的是,有一个Java类使用com.sun.xml.internal.bind.DatatypeConverterImpl。有一件事我会考虑更换这种用法,但在这一点上我只是好奇为什么Gradle找不到那个类,导致编译失败。

消息是

package com.sun.xml.internal.bind does not exist

请注意,它在eclipse中编译良好以及使用javac ant任务。 JAVA_HOME设置为1.6.0_27。

那么Gradle的独特之处在于默认情况下它会导致它找不到这个类,以及有人可以解决这个问题吗?




请参阅Java代码段,后跟build.gradle文件:

final class Test{
    private static final javax.xml.bind.DatatypeConverterInterface DTC = com.sun.xml.internal.bind.DatatypeConverterImpl.theInstance;

    .....
    DTC.printDateTime(Calendar.getInstance());
}


apply plugin: 'java'
apply plugin: 'application'

mainClassName = "com.foo.bar.Test"
sourceCompatibility = 1.6
version = '5.4.0'

jar {
    manifest {
        attributes 'Implementation-Title': 'Foo', 'Implementation-Version': version, 'Implementation-Vendor': 'Bar'
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-lang', name: 'commons-lang', version: '2.4'    
    compile group: 'com.google.guava', name: 'guava', version: '10.0.1'    
    compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.0-api', version: '1.0.1.Final'    
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    compile group: 'jdom', name: 'jdom', version: '1.0'        
    compile group: 'log4j', name: 'log4j', version: '1.2.16'

    runtime group: 'antlr', name: 'antlr', version: '2.7.6'
    runtime group: 'backport-util-concurrent', name: 'backport-util-concurrent', version: '3.1'
    runtime group: 'c3p0', name: 'c3p0', version: '0.9.1.2'
    runtime group: 'cglib', name: 'cglib', version: '2.2'
    runtime group: 'commons-beanutils', name: 'commons-beanutils', version: '1.8.3'
    runtime group: 'commons-codec', name: 'commons-codec', version: '1.3'
    runtime group: 'commons-collections', name: 'commons-collections', version: '3.2.1'
    runtime group: 'commons-io', name: 'commons-io', version: '1.4'    
    runtime group: 'commons-logging', name: 'commons-logging', version: '1.1.1'    
    runtime group: 'dom4j', name: 'dom4j', version: '1.6.1'
    runtime group: 'javassist', name: 'javassist', version: '3.12.0.GA'    
    runtime group: 'javax.transaction', name: 'jta', version: '1.1'        
    runtime group: 'org.slf4j', name: 'slf4j-api', version: '1.6.2'
    runtime group: 'xerces', name: 'xerces', version: '2.4.0'        
    runtime group: 'xerces', name: 'xercesImpl', version: '2.10.0'
    runtime group: 'xml-apis', name: 'xml-apis', version: '2.0.2'                
}

修改

C:\>gradle -v

------------------------------------------------------------
Gradle 1.0-milestone-3
------------------------------------------------------------

Gradle build time: Monday, 25 April 2011 5:40:11 PM EST
Groovy: 1.7.10
Ant: Apache Ant(TM) version 1.8.2 compiled on December 20 2010
Ivy: 2.2.0
JVM: 1.6.0_27 (Sun Microsystems Inc. 20.2-b06)
OS: Windows XP 5.1 x86

5 个答案:

答案 0 :(得分:3)

  • 解决方案#1:

将(不移动)rt.jar复制到不同于<JDK_install_dir>\jre\lib\rt.jar的位置   (例如c:\rt.jar)并运行您的编译器,如下所示:

javac -cp c:\rt.jar your_file.java
  • 解决方案#2:

使用编译器选项-XDignore.symbol.file=true

进行编译

答案 1 :(得分:1)

Gradle还使用下面的javac Ant任务。在Mac OS 10.6上使用Gradle 1.0-milestone-3编译只包含build.gradle apply plugin: "java"的类对我来说很好。所以我最好的猜测是你使用JRE而不是JDK运行Gradle,或者使用1.5而不是1.6运行Gradle。

尝试将以下内容放入构建脚本中,看看它是否有效:

// only available in JDK 1.6
println javax.tools.ToolProvider.getSystemJavaCompiler() 

答案 2 :(得分:1)

为什么不直接使用:

javax.xml.bind.DatatypeConverter.printDateTime(Calendar.getInstance());

答案 3 :(得分:0)

我最近遇到了同样的问题,您可以在此question找到更多相关信息。

我通过引用此library来解决这个问题,您可以看到javax.xml.bind.DatatypeConverterInterface已包含here

我打包了库并通过我的应用程序引用它。

答案 4 :(得分:0)

原因: javac使用不包含所有Sun专有类的特殊符号表。当javac编译代码时,默认情况下它不会针对rt.jar进行链接。而是使用带有类存根的特殊符号文件lib / ct.sym。 解决方案:

compileJava {options.bootClasspath = "$System.env.JAVA_HOME/jre/lib/rt.jar"}