Gradle: Как скомпилировать классы, использующие com.sun.xml.internal.bind. *? - PullRequest
5 голосов
/ 15 октября 2011

Я в процессе преобразования существующего проекта из муравья в Gradle.

К сожалению, есть класс Java, который использует com.sun.xml.internal.bind.DatatypeConverterImpl.Во-первых, я собираюсь посмотреть на замену этого использования, но на данный момент мне просто любопытно, почему Gradle не может найти этот класс, что приводит к ошибке компиляции.

Сообщение:

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

Обратите внимание, что он хорошо компилируется в затмении, а также с помощью задачи 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 ]

3 голосов
/ 19 октября 2011
  • Решение № 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 голос
/ 16 октября 2011

почему бы просто не использовать:

javax.xml.bind.DatatypeConverter.printDateTime(Calendar.getInstance());
1 голос
/ 15 октября 2011

Gradle также использует задачу Ant javac внизу. Компиляция класса с build.gradle, который содержит только apply plugin: "java", отлично работает для меня с Gradle 1.0-milestone-3 в Mac OS 10.6. Поэтому я думаю, что вы используете Gradle с JRE, а не JDK, или с 1.5, а не с 1.6.

Попробуйте вставить следующее в скрипт сборки и посмотреть, работает ли он:

// only available in JDK 1.6
println javax.tools.ToolProvider.getSystemJavaCompiler() 
0 голосов
/ 12 июня 2019

Причина: javac использует специальную таблицу символов, которая не включает все проприетарные классы Sun. Когда javac компилирует код, он не связывается с rt.jar по умолчанию. Вместо этого он использует специальный символьный файл lib / ct.sym с заглушками классов. Решение:

compileJava {options.bootClasspath = "$System.env.JAVA_HOME/jre/lib/rt.jar"}
0 голосов
/ 03 марта 2015

У меня недавно была та же проблема, о которой вы можете найти больше информации в этом вопросе .

Я решил это, сославшись на эту библиотеку , в которой вы можете видеть, что javax.xml.bind.DatatypeConverterInterface включено здесь .

Я упаковал библиотеку и сослался на нее в приложении.

...