Falha ao instalar o android-sdk: “java.lang.NoClassDefFoundError: javax / xml / bind / anototation / XmlSchema”


166

Ao instalar as ferramentas do Android SDK, o seguinte erro é emitido:

java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema

Por que isso está acontecendo e como pode ser corrigido?

Saída de depuração:

$ java --version
java 9
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
$ brew cask install android-sdk
==> Caveats
We will install android-sdk-tools, platform-tools, and build-tools for you.
You can control android sdk packages via the sdkmanager command.
You may want to add to your profile:
  'export ANDROID_SDK_ROOT=/usr/local/share/android-sdk'

This operation may take up to 10 minutes depending on your internet connection.
Please, be patient.

==> Satisfying dependencies
==> Downloading https://dl.google.com/android/repository/sdk-tools-darwin-3859397.zip
Already downloaded: /Users/tomasnovella/Library/Caches/Homebrew/Cask/android-sdk--3859397,26.0.1.zip
==> Verifying checksum for Cask android-sdk
==> Installing Cask android-sdk
==> Exception in thread "main"
==> java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
==>     at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
==>     at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
==>     at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
==>     at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:117)
==>     at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:93)
==> Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
==>     at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
==>     at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
==>     at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
==>     ... 5 more
Error: Command failed to execute!

==> Failed command:
/usr/local/Caskroom/android-sdk/3859397,26.0.1/tools/bin/sdkmanager tools platform-tools build-tools;26.0.1

==> Standard Output of failed command:


==> Standard Error of failed command:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
    at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
    at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
    at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
    at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:117)

Presumo que sua pergunta seja "O que está causando esse erro?" A resposta é que ele não consegue encontrar as classes javax.xml.
Steve

28
Na verdade, essa pergunta é um problema legítimo com a instalação do Android SDK ao ter java9
jontro

17
Eu tenho esse problema e copiei / colei a primeira linha da minha mensagem de erro no google, e essa pergunta foi a primeira ocorrência que surgiu. Não é só isso, uma das respostas abaixo o resolveu. Isso não deve ser totalmente fechado: não importa quais são as regras das perguntas, essa pergunta cumpre comprovadamente todo o objetivo do site.
Le Mot Juiced

1
Exclua qualquer coisa mais antiga que Java 8 de/Library/Java/JavaVirtualMachines
Dimitris

2
O problema ocorre com o Java 8 e Java 11 no Ubuntu 18.04 usando pacotes openjdk-8-jdke openjdk-11-jdk. Alguém sabe o que instalar javax/xml/bind/annotation/XmlSchemaou como evitar javax/xml/bind/annotation/XmlSchemano NDK?
JWW

Respostas:


138

Eu tive um problema semelhante nesta manhã (tentando criar para o Android usando o Unity3D). Acabei desinstalando o JDK9 e instalando o Java SE Development Kit 8u144 . Espero que isto ajude.

  1. brew cask uninstall java # uninstall java9
  2. brew tap homebrew/cask-versions
  3. brew cask install java8 # install java8
  4. touch ~/.android/repositories.cfg # sem esse arquivo, ocorrerá um erro na próxima etapa
  5. brew cask install android-sdk

2
Tenho o erro no Windows 10, tentei isso, ainda não funciona. Alguma dica?
precisa saber é o seguinte

3
Ótimo - isso funcionou para mim na criação de um aplicativo Flutter no Android Studio. Obrigado!
Darragh Enright

20
Isso parou de funcionar, a instalação do barril de fermentação java8 não funciona.
Kd #

4
o comando correto parece estar agorabrew cask install homebrew/cask-versions/java8
caesarsol 17/06/19

21
brew cask install homebrew/cask-versions/adoptopenjdk8parece funcionar
guruz 02/09/19

81

Para resolver esse erro, você pode fazer o downgrade da sua versão Java.

Ou exporta a seguinte opção no seu terminal:

Linux / MAC:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

Windows :

set JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

E para salvá-lo permanentemente, você pode exportar o JAVA_OPTSarquivo do seu perfil no linux ( .zshrc, .bashrce etc.) ou adicionar como variável de ambiente permanentemente no Windows.


ps. Isso não funciona para o Java 11+, que não possui módulos Java EE. Para essa opção, é uma boa idéia, faça o downgrade da sua versão Java ou aguarde uma atualização do Flutter .

Ref: JDK 11: Fim da estrada para módulos Java EE


6
Isso funcionou para mim no Ubuntu 18.04 com o OpenJDK 10.0.2
rastando

3
Trabalhei para mim no macOS Mojave (10.14.2) com a versão Java "10.0.1" 17-04-2018.
Subfuzion

4
Criado um novo erro para mim no MacOS Mojave (10.14.2): Ocorreu um erro durante a inicialização do java.lang.module.FindException camada de boot: java.se.ee Módulo não encontrado
Randy

2
Eu também tentei 1.8.0_191, mas ainda estou recebendo: Erro: Não foi possível localizar ou carregar classe principal java.se.ee
Randy

1
Esta opção não é necessária para o Java 8 e não funciona para o Java 11, que não possui módulos Java EE.
Valdeci

63
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee

Isso corrigiu o problema no Windows para mim.

Fonte 1 , fonte 2


2
Também usei isso no ubuntu 16.04 (usando exportnot set) e resolveu o problema.
Benjamin Conlan

Gênio. Muito obrigado. Pensei que eu ia ter que mudar meu JVM
flocos

1
Trabalhou como um encanto no Windows 10 com Java 10
pabz

4
Infelizmente isso parece ter sido removida totalmente em Java 11.
Alastair Maw

Trabalhou export JAVA_OPTS = '-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'no Ubuntu 18.04
e2-e4

25

Se você não deseja alterar sua versão do Java (eu não), você pode alterar temporariamente a versão no seu shell:

Primeira corrida

/usr/libexec/java_home -V

Em seguida, escolha uma versão principal, se a tiver instalada, caso contrário, instale-a primeiro:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

Agora você pode executar o sdkmanager.


2
$ /usr/libexec/java_home -Vbash: /usr/libexec/java_home: No such file or directory. apt-file search /usr/libexec/java_homenão dá exatamente nada.
Tino

Você tem $ JAVA_HOME definido corretamente? Execute: echo "export JAVA_HOME=`/usr/libexec/java_home`" >> ~/.bashrc(ou perfil se você usar o perfil) - recarregar:. ~/.bashrc
Sarah A

Também não existe /usr/libexec. Você está no MacOS? (Estou no Ubuntu / Linux e Ubuntu / Windows)
Tino

Eu estou usando mac. onde está o seu Java_home?
Sarah A


15

Encontrei duas respostas que funcionaram para mim, sem ter que desinstalar o JDK 10 (ou 9), o que eu preciso create-react-app. JDK 9 e 10 são incompatíveis com android-sdk!


Siu Ching Pong -Asuka Kenji- sugere modificar o sdkmanagerscript, substituindo esta linha:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'  

com:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

Observe que este mod será substituído ao atualizar o sdkmanager.
Confira o post dele e o link para obter mais detalhes.
Essa solução também foi uma das soluções mencionadas neste tópico de problemas do github .


A publicação de German indica a origem do conflito e apresenta uma correção que não será substituída por atualizações.
Ele sugere renomear /Library/Java/JavaVirtualMachines/Info.plistcomo um meio de ocultá-lo do script que procura a versão mais alta do Java que reside no seu sistema. Dessa maneira, o JDK 8 é retornado como padrão.
Referindo-se ao JDK 10 explicitamente, ou configurando-o como $JAVA_HOME, você pode usar o JDK 10, em vez do padrão, sempre que necessário.
Os detalhes estão em seu post.


1
Funcionou perfeitamente, melhor solução IMHO, pois não forçá-lo a rebaixamento java
4levels

De alguma forma, depois de experimentar muito com o. Estúdio Android, esse problema desapareceu eo novo erro foi Could not find or load main class java.se.ee- revertendo os DEFAULT_JVM_OPTS fixo esta ea questão anterior foi embora ..
4levels

3
Infelizmente, isso não funciona agora. O resultado é: Ocorreu um erro durante a inicialização da camada de inicialização java.lang.module.FindException: Módulo java.se.ee não encontrado
Oscar

1
Upvoted stackoverflow.com/a/49630166/5411817 por ter a solução correta para manter jdk-11 e jdk1.8 instalado sem degradação
harrisjb

15

Você precisa adicionar o seguinte ao seu perfil (funciona no MacOS):

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

Não há necessidade de consertar nada.


15

Simplesmente instale o JDK versão 8 e selecione-o como padrão usando:

sudo update-alternatives --config java

10

Atualização 2019-10:

Conforme declarado no rastreador de problemas , o Google está trabalhando em uma nova versão das Ferramentas de Linha de Comando do SDK do Android que é executada nas JVMs atuais (9, 10, 11+) e não depende dos módulos JAXB EE obsoletos!

Você pode baixar e usar as novas ferramentas de linha de comando do SDK do Android no Android Studio ou baixá-las manualmente nos servidores do Google:

Para as versões mais recentes, verifique os URLs dentro do repository.xml .

Se você descompactar manualmente as ferramentas da linha de comando, coloque-as em uma subpasta dentro de $ANDROID_HOME(por exemplo $ANDROID_HOME/cmdline-tools/...).


Ao usar o Java 9+, esta deve ser a resposta a partir de agora!
Luiggi Mendoza 03/07

9

Estranhamente Java9 não é compatível com android-sdk

$ avdmanager
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
    at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
    at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
    at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
    at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
    at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
    ... 5 more

Combine todos os comandos em um para fácil referência:

$ sudo rm -fr /Library/Java/JavaVirtualMachines/jdk-9*.jdk/
$ sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$ sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefPane

$ /usr/libexec/java_home -V
Unable to find any JVMs matching version "(null)".
Matching Java Virtual Machines (0):
Default Java Virtual Machines (0):
No Java runtime present, try --request to install

$ brew tap caskroom/versions
$ brew cask install java8
$ touch ~/.android/repositories.cfg
$ brew cask install android-sdk
$ echo 'export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"' >> ~/.bash_profile
$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
$ avdmanager

Usage:
      avdmanager [global options] [action] [action options]
      Global options:
  -s --silent     : Silent mode, shows errors only.
  -v --verbose    : Verbose mode, shows errors, warnings and all messages.
     --clear-cache: Clear the SDK Manager repository manifest cache.
  -h --help       : Help on a specific command.

Valid actions are composed of a verb and an optional direct object:
-   list              : Lists existing targets or virtual devices.
-   list avd          : Lists existing Android Virtual Devices.
-   list target       : Lists existing targets.
-   list device       : Lists existing devices.
- create avd          : Creates a new Android Virtual Device.
-   move avd          : Moves or renames an Android Virtual Device.
- delete avd          : Deletes an Android Virtual Device.

8

Como o Java 11 removeu o JavaEE, você precisará fazer o download de alguns jars e adicionar ao caminho de classe:

JAXB: https://javaee.github.io/jaxb-v2/

JAF: https://www.oracle.com/technetwork/articles/java/index-135046.html

Em seguida, edite sdkmanager.bat para que o conjunto CLASSPATH = ... termine com ;% CLASSPATH%

Configure CLASSPATH para incluir JAXB e JAF:

set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar

Então sdkmanager.bat funcionará.


Funciona, mas recebo este aviso: AVISO: Acesso reflexivo ilegal por com.sun.xml.bind.v2.runtime.reflect.opt.Injector (arquivo: / F: / android_sdk / java / jaxb-ri / lib / jaxb -impl.jar) ao método java.lang.ClassLoader.defineClass (java.lang.String, byte [], int int)
AndyMc

Ya, parece que o Java está começando a alertar contra a prática incorreta de programação de usar a reflexão para ignorar a segurança de classe, que o JAXB usa (o Oracle infringe suas próprias regras);)
Peter Quiring

4

Corri para o mesmo problema ao executar:

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"_

Eu resolvi isso como

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home    

$ ls /Library/Java/JavaVirtualMachines/

jdk-11.0.1.jdk      
jdk1.8.0_202.jdk

Mude o Java para usar 1.8

$ export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home'

Então o mesmo comando corre bem

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"

Este é o melhor caso. Se você já exportar JAVA_OPTS. Remova-o primeiro antes de executar as etapas desta resposta.
Sword Jason

4

Eu enfrentei o mesmo problema. Embora eu seja um desenvolvedor antiquado (ainda usando o Windows para desenvolver: P)

Para resolver esse problema no Windows :

ETAPA 1: Instale o jdk 8 se não estiver instalado (o jdk 9 ou 11 não funciona, mas você pode instalá-los para uso em outros usos do desenvolvedor).

Muito simples usando Chocolatey:

choco install jdk8

(Se instalado usando Chocolatey, pule as etapas 2 e 3)

PASSO 2: Vá para as configurações de variáveis ​​de ambiente e defina o diretório de instalação do JAVA_HOME TO jdk 8.

JAVA_HOME

PASSO 3: Vá para a variável path e adicione o diretório bin do jdk 8 e mova-o para o topo.

Path_varriable

PASSO 4: Feche todas as sessões de terminal abertas e reinicie uma nova sessão

ETAPA OPCIONAL 5: Dependendo do seu objetivo na execução do terminal (pode ser necessário adicionar o sdkmanager ao caminho ou simplesmente navegar para o diretório):

sdkmanager --update

Isso é tudo! : O Desfrute de esvoaçantes! : D


1
Isso, juntamente com a resposta superior, funcionou para mim no Windows 10!
mauriii 8/04

THANKSSSSSSSSSSSSSS
Raghav Joshi

2

Para máquinas Windows, desinstale o JDK se for maior que 1.8.172. Instale o JDK 1.8.172

Eu estava enfrentando o mesmo problema no Windows 10 com o java 10. Desinstalei o java 10 e instalei o java8 agora está funcionando bem para mim :)


2

Para usuários do Linux (estou usando uma distribuição Debian, Kali), veja como resolvi o meu.

Se você ainda não possui o jdk-8, deseja obtê-lo no site da oracle

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Eu obtive o jdk-8u191-linux-x64.tar.gz

Etapa 1 - Instalando o Java Move e descompacte-o em um local adequado como este

$ mv jdk-8u191-linux-x64.tar.gz /suitablelocation/
$ tar -xzvf /suitablelocation/jdk-8u191-linux-x64.tar.gz

Você deve obter uma pasta descompactada como jdk1.8.0_191. Você pode excluir o tarball posteriormente para economizar espaço

Etapa 2 - Configurando alternativas para o local padrão do java

$ update-alternatives --install /usr/bin/java java /suitablelocation/jdk1.8.0_191/bin/java 1
$ update-alternatives --install /usr/bin/javac javac /suitablelocation/jdk1.8.0_191/bin/javac 1

Etapa 3 - Selecionando suas alternativas como padrão

$ update-alternatives --set java /suitablelocation/jdk1.8.0_191/bin/java
$ update-alternatives --set javac /suitablelocation/jdk1.8.0_191/bin/javac

Etapa 4 - Confirmando a versão java padrão

$ java -version

Notas

  1. No artigo original aqui: https://forums.kali.org/showthread.php?41-Installing-Java-on-Kali-Linux , o plug-in padrão do mozilla também foi definido. Suponho que realmente não precisamos dos plugins, pois estamos simplesmente tentando desenvolver para o Android.
  2. Como na resposta do @ spassvogel, você também deve colocar um arquivo @ repositories.cfg no diretório ~ / .android, pois isso é necessário para atualizar as listas de repositórios de ferramentas
  3. Mover algumas coisas pode exigir autoridade raiz. Use sudo sabiamente.
  4. Para uso do sdkmanager, consulte o guia oficial: https://developer.android.com/studio/command-line/sdkmanager

1

Execute java -versione javac -versioncomandos em uma linha de comandos para garantir que eles sejam do mesmo JDK (por exemplo: versão 1.8.0_181)

Caso contrário, é necessário modificar a PATHvariável para que ela aponte apenas para um único JDK. Se você não tiver certeza de como fazê-lo, desinstale todas as outras instâncias Java, com exceção do Java 8 (Adicionar / Remover Programas no Windows). Hoje, o Unity e o Android recomendam o uso do JDK 8.

Com o Java 8, não é necessário exportar o java.se.eemódulo, como mostrado em algumas das outras respostas. Você também pode remover qualquer JAVA_OPTSou outras variáveis ​​de ambiente que você definiu.


1

Eu havia resolvido esse problema recentemente desinstalando a versão superior do JDK e instalando o JDK 8. Depois de instalar o JDK, você precisa fornecer o caminho. Em seguida, é necessário abrir o prompt de comando em "C: \ Users \ Milan Adhikari \ AppData \ Local \ Android \ Sdk \ tools" e executar "sdkmanager --update", que atualizará o seu sdk e, em seguida, você precisará executar "flutter doctor - -android-licenças "no cmd e aceite todas as licenças.
Agora seu problema deve ser resolvido.


1

No meu caso, preciso do JDK 8 (tentando usar o gerenciador AVD e SDK no Qt no ubuntu) e 11 para ferramentas diferentes. Remover a versão 11 não é uma opção.

As soluções 'JAVA_OPTS' não fizeram nada. Eu realmente não gosto da exportação JAVA_HOME, pois ela pode forçar o lançamento de qualquer ferramenta que chame esses utilitários do mesmo shell (como o Qt), ou forçar você a tornar isso permanente, o que não é conveniente.

Então, para mim, a solução é bastante simples. Adicione algo parecido com isto na segunda linha de ~ / Android / tools / bin / sdkmanager e ~ / Android / tools / bin / avdmanager:

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

(ou qualquer que seja o caminho para o seu rev ​​8 jdk).

Com isso, essas ferramentas de linha de comando funcionam em modo autônomo, e também quando chamadas por outras ferramentas, como Qt, e o jdk 11 ainda é o padrão do sistema para outras. Não há necessidade de misturar bibliotecas etc ...

A única desvantagem é que qualquer atualização dessas ferramentas de linha de comando apagará essas modificações, que você precisará colocar novamente.


TOPO! obrigado!
Funder

0

Faça o downgrade da sua versão java. Qualquer que seja o sistema ou ide.

Verifique se a versão java não é superior a 8

No meu caso, eu altero o ide java verion.Isso resolve meu problema. insira a descrição da imagem aqui


0

Quando o seu Android stuio / jre usa uma versão diferente do java, você receberá esse erro. Para resolvê-lo, basta definir o Android studio / jre como seu JAVA_HOME. e desinstale seu próprio java.


0

Para mim, instalei a versão java 8 e apenas selecione a versão java em "Localização do JDK": insira a descrição da imagem aqui


0

Para minha circunstância, estou usando o sdkman para gerenciar várias versões java. Defino a versão java padrão como 13. Instale a versão 8 e agora está funcionando bem.


0

A melhor maneira é usar o comando abaixo

   $ wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
   $ unzip \platform-tools-latest-linux.zip
   $ sudo cp platform-tools/adb /usr/bin/adb
   $ sudo cp platform-tools/fastboot /usr/bin/fastboot

Agora execute a versão adb para verificar se foi atualizada.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.