Сильно усеченный атрибут при компиляции проекта JavaFX Undertow Websockets для Android с плагином jfxmobile

У меня возникла проблема при компиляции моего проекта JavaFX для Android. В состав проекта входит куча библиотек, среди них Undertow Websockets. Я загрузил все необходимые jar-файлы в свой каталог lib и включил их в блок зависимостей/компилируемых файлов файла build.gradle.

Я смог решить другие проблемы с зависимостями jar-файлов (в основном DuplicateFileException), но одна библиотека Undertow - undertow-core-1.3.14.Final.jar вызывает у меня небольшую головную боль.

Когда я добавляю его в блок compile file файла gradle.build, ‘gradlew android’ дает мне сообщение об ошибке:

Что пошло не так: не удалось выполнить задачу ‘:createMainDexList’.

Исключение в потоке «основной» com.android.dx.cf.iface.ParseException: сильно усеченный атрибут в com.android.dx.cf.direct.StdAttributeFactory.throwSeverelyTruncated(StdAttributeFactory.java:736) в com.android.dx.cf .direct.StdAttributeFactory.runtimeVisibleParameterAnnotations(StdAttributeFactory.java:661) в com.android.dx.cf.direct.StdAttributeFactory.parse0(StdAttributeFactory.java:162) в com.android.dx.cf.direct.AttributeFactory.parse(AttributeFactory .java:96) в com.android.dx.cf.direct.AttributeListParser.parse(AttributeListParser.java:141) в com.android.dx.cf.direct.AttributeListParser.parseIfNecessary(AttributeListParser.java:115) в com. android.dx.cf.direct.AttributeListParser.getEndOffset(AttributeListParser.java:96) в com.android.dx.cf.direct.MemberListParser.parse(MemberListParser.java:213) в com.android.dx.cf.direct. MemberListParser.parseIfNecessary(MemberListParser.java:108) в com.android.dx.cf.direct.MethodListParser.getList (MethodListParser.java:54) в com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:542) в com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406) в com.android.dx.cf.direct.DirectClassFile.parseToEndIfNecessary(DirectClassFile.java:397) в com.android.dx.cf.direct.DirectClassFile.getAttributes(DirectClassFile.java:311) в com.android.multidex.MainDexListBuilder. hasRuntimeVisibleAnnotation(MainDexListBuilder.java:191) по адресу com.android.multidex.MainDexListBuilder.keepAnnotated(MainDexListBuilder.java:167) по адресу com.android.multidex.MainDexListBuilder.(MainDexListBuilder.java:121) по адресу com.android.multidex.MainDexListBuilder. main(MainDexListBuilder.java:91) at com.android.multidex.ClassReferenceListBuilder.main(ClassReferenceListBuilder.java:58) …при анализе атрибута RuntimeVisibleParameterAnnotations по смещению 0009c07 > …при анализе атрибутов[3] …при анализе методов[1] …пока парсинг io/undertow/client/http/H ttpResponseParser$$сгенерированный.класс

Ниже приведено содержимое моего файла build.gradle:

task wrapper(type: Wrapper) {
    gradleVersion = '2.10'
}
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.0.7'          

    }       
}


apply plugin: 'org.javafxports.jfxmobile'

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

sourceCompatibility = 1.8  
targetCompatibility = 1.8

repositories {
    jcenter()
}

mainClassName = 'com.simlayserstudio.SimlayserStudio'

jfxmobile {
    android {
        manifest = 'src/android/AndroidManifest.xml'
//        compileSdkVersion = 16 // version 4.2.1
        compileSdkVersion = 23 // version 6
        packagingOptions {
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/INDEX.LIST'
            exclude 'META-INF/services/io.undertow.attribute.ExchangeAttributeBuilder'
            exclude 'META-INF/services/io.undertow.predicate.PredicateBuilder'
            exclude 'META-INF/services/io.undertow.server.handlers.builder.HandlerBuilder'
            //exclude 'META-INF/services/javax.annotation.processing.Processor'

        }
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
    }
}

dependencies {      

        compile  ('commons-codec:commons-codec:1.10',
                  'commons-io:commons-io:2.4',
                  'commons-lang:commons-lang:2.6',
//                  'io.undertow:undertow-servlet:1.3.14.Final' // Duplicate zip entry [allclasses.jar:javax/annotation/Generated.class
            )

    compile files(           
        '/lib/jboss-logging-3.2.1.Final.jar', //ok wtih exclude 'META-INF/INDEX.LIST'
//        '/lib/undertow-core-1.3.14.Final.jar', // ERROR com.android.dx.cf.iface.ParseException: severely truncated attribute
        '/lib/undertow-servlet-1.3.14.Final.jar', // ok wtih exclude ExchangeAttributeBuilder, PredicateBuilder, HandlerBuilder     
        '/lib/undertow-websockets-jsr-1.3.14.Final.jar', //ok with  exclude 'META-INF/INDEX.LIST'
        '/lib/xnio-api-3.3.4.Final.jar', //ok with  exclude 'META-INF/INDEX.LIST'
        '/lib/xnio-nio-3.3.4.Final.jar', //ok with  exclude 'META-INF/INDEX.LIST'

        '/lib/apache-commons.jar',        //ok
        '/lib/com.thoughtworks.xstream.jar', //ok                         
        '/lib/javax.websocket-api-1.0.jar', //ok
        '/lib/log4j-1.2.17.jar',  //ok              
        '/lib/xmlpull-xpp3-1.1.4c.jar', //ok
    )    


}

Кому-нибудь удалось сгенерировать apk с помощью веб-сокетов Undertow или столкнуться с подобными проблемами со сторонними библиотеками?

Любая помощь приветствуется. Благодарю вас!


person velena    schedule 22.03.2016    source источник


Ответы (1)


Я смог воспроизвести ту же ошибку, которую вы опубликовали, просто используя эти зависимости и запустив ./gradlew android:

dependencies {
    compile ('io.undertow:undertow-servlet:1.3.19.Final') {
        exclude group: 'org.jboss.spec.javax.annotation' 
    }
    compile ('io.undertow:undertow-core:1.3.19.Final') {
        exclude group: 'org.jboss.spec.javax.annotation' 
    }
    compile ('io.undertow:undertow-websockets-jsr:1.3.19.Final') {
        exclude group: 'org.jboss.spec.javax.annotation' 
    }
}

Поэтому, чтобы узнать о возможной проблеме, я скачал исходники io.undertow` с здесь добавил необходимые зависимости (возможно, я не использую точные версии):

dependencies {
    compile 'org.jboss.logging:jboss-logging-annotations:2.0.1.Final'
    compile 'org.jboss.classfilewriter:jboss-classfilewriter:1.0.4.Final'
    compile 'org.eclipse.jetty.alpn:alpn-api:1.0.0'
    compile 'org.jboss.xnio:xnio-nio:3.3.4.Final'
    compile 'org.jboss.xnio:xnio-api:3.3.4.Final'
    compile 'org.jboss.logging:jboss-logging:3.2.1.Final'
    compile 'org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.0.Final'
    compile 'org.jboss.spec.javax.servlet:jboss-servlet-api_3.1_spec:1.0.0.Final'
}

И чтобы избежать дублирования классов из javax.annotation, я скачал исходники org.jboss.spec.javax.annotation:jboss-annotations-api_1.1_spec из здесь и удалил эти три класса: Generated.java, PostConstruct.java и PreDestroy.java.

Мне удалось успешно запустить ./gradlew android, но я не проверял это.

Если у вас все еще есть проблемы со сборкой или последующим запуском на устройстве, возможно, вы можете рассмотреть другие альтернативы для веб-сокетов, такие как Tyrus проект.

Это проект, где мы успешно его использовали.

person José Pereda    schedule 22.03.2016
comment
Большое спасибо Хосе! Это было именно то, что мне было нужно. Я следовал вашим шагам и смог сгенерировать apk. Ура! У меня еще не было возможности развернуть и запустить его, но, по крайней мере, сейчас компиляция работает. Спасибо за совет рассмотреть альтернативы веб-сокетам. Я обязательно посмотрю. - person velena; 24.03.2016