6

I'm in the process of converting an existing project from ant to Gradle.

Unfortunately there is a Java class that uses com.sun.xml.internal.bind.DatatypeConverterImpl. For one thing I'm going to look into replacing that usage, but at this point I'm just curious why Gradle cannot find that class, which results in a compilation failure.

The message is

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

Note that it compiles fine in eclipse as well as using the javac ant task. JAVA_HOME is set to 1.6.0_27.

So what is unique about Gradle that by default causes it to not find this class and how could someone workaround this issue?




See Java code snippet followed by build.gradle file:

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'                
}

EDIT

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
Dave L.
  • 9,595
  • 7
  • 43
  • 69
  • 1
    See also: http://stackoverflow.com/questions/13068146/how-to-overcome-package-com-sun-xml-internal-xxx-does-not-exist-when-compiling – Luke Quinane Jun 28 '16 at 01:47

5 Answers5

3
  • Solution #1:

Copy (not move) rt.jar to a location different than <JDK_install_dir>\jre\lib\rt.jar (for example to c:\rt.jar) and run your compiler like below:

javac -cp c:\rt.jar your_file.java
  • Solution #2:

Compile with compiler option -XDignore.symbol.file=true

Benoit Duffez
  • 11,839
  • 12
  • 77
  • 125
Mirek
  • 31
  • 2
  • Said link is broken. More information can be found here, for example: http://openjdk.java.net/projects/sctp/html/sctp6.html – Benoit Duffez Jul 18 '15 at 13:20
1

Gradle also uses the javac Ant task underneath. Compiling the class with a build.gradle that only contains apply plugin: "java" works fine for me with Gradle 1.0-milestone-3 on Mac OS 10.6. So my best guess is that you are running Gradle with a JRE rather than a JDK, or with 1.5 rather than 1.6.

Try to put the following into the build script and see if it works:

// only available in JDK 1.6
println javax.tools.ToolProvider.getSystemJavaCompiler() 
Peter Niederwieser
  • 121,412
  • 21
  • 324
  • 259
  • Yes it prints out com.sun.tools.javac.api.JavacTool@1d4e49a. I don't have JDK 5 on my system so I don't think it is that. Any other idea? Thx. – Dave L. Oct 15 '11 at 20:25
  • Try with a build script that only contains `apply plugin: "java"`. Which OS? Which Gradle version (`gradle -v`)? – Peter Niederwieser Oct 15 '11 at 20:31
  • I added version info at the bottom of the post -- trying to reduce the build script now to a minimum. – Dave L. Oct 15 '11 at 20:34
1

why not just use:

javax.xml.bind.DatatypeConverter.printDateTime(Calendar.getInstance());
jtahlborn
  • 52,909
  • 5
  • 76
  • 118
  • 1
    That seems fine and compiles, but I'm still trying to figure out what the issue is though. Seems like it should work even though it is obviously better not to use those com.sun.* classes. – Dave L. Oct 15 '11 at 20:58
  • Is `com.sun.xml.internal.bind.DatatypeConverterImpl` found when used in the build script? – Peter Niederwieser Oct 15 '11 at 21:20
0

I had the same problem recently which you can find more information about in this question.

I solved it by referencing this library which you can see that javax.xml.bind.DatatypeConverterInterface is included here.

I packaged the library and referenced it by my application.

Community
  • 1
  • 1
amadib
  • 868
  • 14
  • 33
0

reason: javac uses a special symbol table that does not include all Sun-proprietary classes. When javac is compiling code it doesn't link against rt.jar by default. Instead it uses special symbol file lib/ct.sym with class stubs. solution:

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