简体   繁体   English

如何从 CLI 构建和运行 android 应用程序?

[英]How do I build and run android app from CLI?

So I have an android project setup and I am using Kotlin as primary language.所以我有一个 android 项目设置,我使用Kotlin作为主要语言。 I have also used Databinding Library from Jetpack.我还使用了 Jetpack 的数据绑定库 Out of curiosity, I tried to build the app from CLI.出于好奇,我尝试从 CLI 构建应用程序。 The application is building and running fine from the GUI, Run button.该应用程序正在从 GUI 的“运行”按钮构建和运行良好。 As far as I know I can build and run from the CLI too, right?据我所知,我也可以从 CLI 构建和运行,对吧? So I ran所以我跑了

./gradlew assembleDebug

and I was not able to build the application.而且我无法构建应用程序。 I got the following output on my terminal:我在终端上收到了以下 output :

> Task :app:kaptDebugKotlin FAILED
e: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
        at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137)
        at java.base/java.lang.Class.getConstructor0(Class.java:3342)
        at java.base/java.lang.Class.newInstance(Class.java:556)
        at org.jetbrains.kotlin.cli.jvm.plugins.ServiceLoaderLite.loadImplementations(ServiceLoaderLite.kt:51)
        at org.jetbrains.kotlin.cli.jvm.plugins.ServiceLoaderLite.loadImplementations(ServiceLoaderLite.kt:44)
        at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension$loadProcessors$efficientProcessorLoader$1.doLoadProcessors(Kapt3Extension.kt:84)
        at org.jetbrains.kotlin.kapt3.base.ProcessorLoader.loadProcessors(ProcessorLoader.kt:45)
        at org.jetbrains.kotlin.kapt3.base.ProcessorLoader.loadProcessors$default(ProcessorLoader.kt:28)
        at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.loadProcessors(Kapt3Extension.kt:89)
        at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:172)
        at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:99)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:96)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:106)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:81)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:555)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:82)
        at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:546)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:177)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:164)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:54)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1558)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
        at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
        at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 43 more

Now I am guessing, this error has something to do with Databinding but I could be wrong.现在我猜,这个错误与数据绑定有关,但我可能是错的。 I also tried to look at some open source android projects using CI/CD in their projects to see what they are doing but I could not find one which uses DataBinding library.我还尝试查看一些在其项目中使用 CI/CD 的开源 android 项目,以了解他们在做什么,但我找不到使用 DataBinding 库的项目。 All they had was the same two three gradle scripts which are not running for me.他们所拥有的只是两个没有为我运行的 gradle 脚本。 Do suggest me a solution to this so that I will be able to build and run my application from the command line.请建议我解决此问题,以便我能够从命令行构建和运行我的应用程序。

So what turns out is JAXB (Java Architecture for XML Binding) seems missing in Java 11 which was being used in my system.所以结果是 JAXB(XML 绑定的 Java 架构)似乎在 Java 11 中丢失,它正在我的系统中使用。 When I did java -version on my terminal, I got Open JDK 11 which was located in usr/lib/jvm/ .当我在终端上java -version时,我得到了位于usr/lib/jvm/中的Open JDK 11 So I went ahead and removed it.所以我继续删除它。

 sudo rm -r /usr/lib/jvm/java-11-openjdk-amd64

Then I installed Java 8 Open JDK然后我安装了Java 8 打开JDK

sudo apt install openjdk-8-jdk openjdk-8-jre

Now I have java 8 which is also used by Android Studio and has the JAXB api.现在我有 java 8,它也被 Android Studio 使用,并且有 JAXB Z8A5DA52ED1264412A8AAZ7E。 Do correct me if I am wrong as this is a self baked solution and I am not sure about a lot of things here.如果我错了,请纠正我,因为这是一个自我烘焙的解决方案,我不确定这里的很多事情。

But yeah ./gradlew assembleDebug and other commands works fine now.但是是./gradlew assembleDebug和其他命令现在可以正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM