【问题标题】:Class Not Found at RunTime, but there at compile time, using command line在运行时未找到类,但在编译时使用命令行
【发布时间】:2013-03-04 22:23:40
【问题描述】:

我知道我的源代码在 Eclipse 中编译得很好,但是为了更容易地反复使用相同的源代码进行生产,我选择设置一个 .bat 来为我处理大部分工作。好吧,简短而甜蜜,我的外部 jar 在编译时不可用,但在运行时不可用,我收到强制关闭(Android ClassNotFoundDefError)。我确定问题出在我的命令是如何在我的 .bat 文件中设置的,并且在阅读了网站之后(我将列出我最后使用的一组参考资料)我来到了这段代码......

echo on
@REM %1 NOTUSED
@REM %2 SHORT NAME (DIR HIERARCHY POINTER)
@REM %3 SRCPATH (RECEIVES PACKAGE PATH)
@SET PREV_PATH=%CD%
@cd /d %0\..

@rmdir %2\bin /S /Q
@rmdir %2\gen /S /Q
@mkdir %2\bin || goto EXIT
@mkdir %2\gen || goto EXIT
@SET APP_NAME=%2
@SET ANDROID_REV=android-7

@SET ANDROID_AAPT_ADD="%ANDROID-SDK%\platform-tools\aapt.exe" add

@SET ANDROID_AAPT_PACK="%ANDROID-SDK%\platform-tools\aapt.exe" package -v -f -I "%ANDROID-SDK%\platforms\%ANDROID_REV%\android.jar" -j ".\usrsrc\libs\MobileSDK.jar" -j ".\usrsrc\libs\MobileSDK2.jar"

@SET ANDROID_DX="%ANDROID-SDK%\platform-tools\dx.bat" --dex

@SET JAVAC="%JAVABIN%\javac.exe" -classpath ".\%2;%ANDROID-SDK%\platforms\%ANDROID_REV%\android.jar;%2\libs\MobileSDK.jar;%2\libs\MobileSDK2.jar"

@SET JAVAC_BUILD=%JAVAC% -sourcepath "%2\src;%2\gen" -d "%2\bin" -jar "%2\libs\MobileSDK.jar;%2\libs\MobileSDK2.jar"

call %ANDROID_AAPT_PACK% -M "%2\AndroidManifest.xml" -A "%2\assets" -S "%2\res" -m -J "%2\gen" -F "%2\bin\resources.ap_" -j "%2\libs\MobileSDK.jar" -j "%2\libs\MobileSDK2.jar" || goto EXIT

call %JAVAC_BUILD% %2%3*.java || goto EXIT

call %ANDROID_DX% --output="%CD%\%2\bin\classes.dex" %CD%\%2\bin || goto EXIT

copy "%CD%\%2\bin\resources.ap_" "%CD%\%2\bin\%APP_NAME%.ap_" || goto EXIT

call %ANDROID_AAPT_ADD% "%CD%\%2\bin\%APP_NAME%.ap_" "%CD%\%2\bin\classes.dex" || goto EXIT

call "%JAVABIN%\jarsigner" -keystore "%CD%\keystore.keystore" -storepass "XXXXXXXXXX" - keypass "XXXXXXXX" -signedjar "%CD%\%2\%APP_NAME%.apk" "%CD%\%2\bin\%APP_NAME%.ap_" "XXXXXXXXX" || goto EXIT
del "%2\bin\%APP_NAME%.ap_"
:EXIT
cd "%PREV_PATH%"
ENDLOCAL
pause
exit /b %ERRORLEVEL%

现在我知道,每当有人向我展示答案是多么显而易见时,我都会感到非常愚蠢。但是我已经在这件事上坚持了大约 24 小时了,我再也受不了了。我将不胜感激。

仅供参考:输入此 bat 的大多数变量都来自另一个程序,该程序设置文件层次结构和其他所有内容,甚至在我们进入 .bat 之前。关于这个问题,我只能描述这些。

参考:
http://www.herongyang.com/Android/Project-aapt-Android-Asset-Packaging-Tool.html
http://www.apriorit.com/our-company/dev-blog/233-how-to-build-apk-file-from-command-line
以及关于外部 jar 堆栈溢出的所有问题; 还有一些;我暂时找不到会像我一样更新。

【问题讨论】:

  • 我只能说......多么可怕的构建方式。了解 Apache Ant。
  • 我同意。你应该问问自己为什么这样做,然后解决这个问题。放弃这个糟糕的批处理工作,帮您保持理智。这就是 Oracle 写的东西:)
  • 是的,谢谢,你们俩都为我提供了常识,谢谢。我已经深入研究了 Ant 和其他东西。出于个人原因,我想尝试通过命令行进行操作;但是,是的,我很喜欢被人质问。

标签: java android command-line classpath noclassdeffounderror


【解决方案1】:

因为不像某些人;我确实想提供帮助,并且过去曾收到过潜伏堆栈溢出的答案,在我研究了答案后我回来了,因为我在堆栈溢出中多次看到这个问题,没有人对此给出正确答案:

"您必须在 dx.bat 中显式调用您的外部 jar"

call %ANDROID_DX% --output="%CD%\%2\bin\classes.dex" "%CD%\%2\bin" "C:\<dir>\mobileSDK.jar" "C:\<dir>\MobileSDK2.jar" || goto EXIT

您必须提供一个没有空格的静态地址,以符合“java 标准”(请参阅​​我在上面的问题中的参考资料)。这告诉 Android 构建内容将这两个 jar 包作为编译代码包含在内。


他们的第一个电话

@SET ANDROID_AAPT_PACK="%ANDROID-SDK%\platform-tools\aapt.exe" package -v -f -I "%ANDROID-SDK%\platforms\%ANDROID_REV%\android.jar" -j ".\usrsrc\libs\MobileSDK.jar" -j ".\usrsrc\libs\MobileSDK2.jar"

它们在编译期间是唯一的,并且具有可供编译器使用的类以避免由于缺少更好的术语而引发错误。
将它们包含在 dx.bat 中也会告诉它在将其压缩成 APK 时包含这些 .jar 以及所有 .class 文件。但我希望这对将来的某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2013-06-01
    • 2020-02-25
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多