java - 在运行时找不到类,但在编译时使用命令行找到类

标签 java android command-line classpath noclassdeffounderror

我知道我的源代码在 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 的所有问题; 还有一些;我暂时找不到会像我一样更新。

最佳答案

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

“您必须在 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 文件。但我希望这对将来的人有所帮助。

关于java - 在运行时找不到类,但在编译时使用命令行找到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15445375/

相关文章:

git - 戈朗 : Executing a command with its arguments

java - 编写长测试方法名称来描述测试与在代码文档中使用

java - 当我返回到第一个 Activity 时,第二个 Activity 的 onCreate() 函数不会在第二次调用

android - 在 Android 中获取联系方式需要花费大量时间?

Android Studio/Kotlin : Gradle error - cannot find compile() method for arguments [com. android.support:recyclerview-v7:$support_version]

powershell - 如何从命令行使用paket

java - Log4j 找不到 appender,但它们存在

java - 如何考虑字符串中的数字对字符串进行排序?

android - adb 设备在 Mac OS X 中使用 Galaxy S4 显示离线

python - 使用 Python 从 linux 命令行读取