Apache SSH в Java на Android, java.lang.ClassNotFoundException:

Я пытаюсь подключиться к SSH из своего приложения для Android, используя Java. Я получаю следующее исключение при попытке установить соединение.

FATAL EXCEPTION: main
Process: com.example.atest, PID: 14392
java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/management/ReflectionException;
    at org.apache.sshd.common.util.GenericUtils.peelException(GenericUtils.java:728)
    at org.apache.sshd.common.future.AbstractSshFuture.verifyResult(AbstractSshFuture.java:121)
    at org.apache.sshd.client.future.DefaultConnectFuture.verify(DefaultConnectFuture.java:42)
    at org.apache.sshd.client.future.DefaultConnectFuture.verify(DefaultConnectFuture.java:34)
    at com.example.atest.MainActivity.sshConnect(MainActivity.java:372)
    at com.example.atest.MainActivity.onResults(MainActivity.java:335)
    at android.speech.SpeechRecognizer$InternalRecognitionListener$1.handleMessage(SpeechRecognizer.java:1062)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:230)
    at android.os.Looper.loop(Looper.java:319)
    at android.app.ActivityThread.main(ActivityThread.java:8893)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.management.ReflectionException" on path: DexPathList[[dex file "/data/data/com.example.atest/code_cache/.overlay/base.apk/classes4.dex", dex file "/data/data/com.example.atest/code_cache/.overlay/base.apk/classes5.dex", zip file "/data/app/~~iTqpPkZDjYiDFfzmOJt2nQ==/com.example.atest-uHpPjOVd-8RZr-nUHh2kaw==/base.apk"],nativeLibraryDirectories=[/data/app/~~iTqpPkZDjYiDFfzmOJt2nQ==/com.example.atest-uHpPjOVd-8RZr-nUHh2kaw==/lib/arm64, /data/app/~~iTqpPkZDjYiDFfzmOJt2nQ==/com.example.atest-uHpPjOVd-8RZr-nUHh2kaw==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at org.apache.sshd.common.util.GenericUtils.peelException(GenericUtils.java:728) 
    at org.apache.sshd.common.future.AbstractSshFuture.verifyResult(AbstractSshFuture.java:121) 
    at org.apache.sshd.client.future.DefaultConnectFuture.verify(DefaultConnectFuture.java:42) 
    at org.apache.sshd.client.future.DefaultConnectFuture.verify(DefaultConnectFuture.java:34) 
    at com.example.atest.MainActivity.sshConnect(MainActivity.java:372) 
    at com.example.atest.MainActivity.onResults(MainActivity.java:335) 
    at android.speech.SpeechRecognizer$InternalRecognitionListener$1.handleMessage(SpeechRecognizer.java:1062) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loopOnce(Looper.java:230) 
    at android.os.Looper.loop(Looper.java:319) 
    at android.app.ActivityThread.main(ActivityThread.java:8893) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) 

Это мое приложение/build.gradle..

dependencies {

    implementation "org.apache.mina:mina-core:3.0.0-M2"

    implementation "org.apache.sshd:sshd-core:2.1.0"

    implementation "org.apache.sshd:sshd-putty:2.1.0"

    implementation "org.apache.sshd:sshd-common:2.1.0"

    implementation "org.slf4j:slf4j-api:1.7.5"

    implementation "org.slf4j:slf4j-simple:1.6.4"

..и это мой ssh-метод..

public void sshConnect(String username, String password, String host, int port, long defaultTimeoutSeconds, String command) {

        // create a client instance
        try (SshClient client = SshClient.setUpDefaultClient()) {
            client.start();
            Log.d(TAG, "sshConnect(): client.start(): client started");

            // connection and authentication
            try (ClientSession session = client.connect(username, host, port).verify(TimeUnit.SECONDS.toMillis(defaultTimeoutSeconds)).getSession()) {
                Log.d(TAG, "ssh: client.connect()");
                session.addPasswordIdentity(password);
                session.auth().verify(TimeUnit.SECONDS.toMillis(defaultTimeoutSeconds));
                Log.d(TAG, "ssh: connection established");

                // create a channel to communicate
                channel = session.createChannel(Channel.CHANNEL_SHELL);
                Log.d(TAG, "ssh: starting shell");

                ByteArrayOutputStream responseStream = new ByteArrayOutputStream();
                channel.setOut(responseStream);

                // open channel
                channel.open().verify(5, TimeUnit.SECONDS);

                // open channel
                channel.open().verify(5, TimeUnit.SECONDS);
                try (OutputStream pipedIn = channel.getInvertedIn()) {
                    pipedIn.write(command.getBytes());
                    pipedIn.flush();
                }

                // close channel
                channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED),
                        TimeUnit.SECONDS.toMillis(5));

                // output after converting to string type
                String responseString = responseStream.toString();
                Log.d(TAG, "ssh: responseString == " + responseString);

            } catch (Exception e) {
                Log.d(TAG, "sshConnect(): client.connect(): Exception: " + e.toString());
                e.printStackTrace();
            }
        } catch (Exception e) {
            Log.d(TAG, "sshConnect(): client.start(): Exception: " + e.toString());
            e.printStackTrace();

        }
    }

Такое ощущение, что мне не хватает «реализации» в моем градиенте, но в моих ссылках было только то, что я взял.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Android нет пакетов и классов javax.management.*, поэтому вы получаете ClassNotFoundException. Возможное решение — здесь. Добавив следующее в градиент уровня приложения:

implementation 'javax.management:jmx:1.2.1'

и это тебе на settings.gradle в Google()

maven {
   url 'https://www.datanucleus.org/downloads/maven2/'
}

вы получаете необходимые классы, которые позволят вам строить.

Другие вопросы по теме

Убедиться, что WebView открывает новый URL-адрес после нажатия на BottomBarItem (трепетание)
ПроизводноеStateOf не отвечает. Помогите мне понять, почему
Средства за встроенные приложения Google Play всегда возвращаются через 3 дня в Xamarin.Android/.NET 8
Как я могу сохранить настройки в Jetpack Compose, используя хранилище данных настроек?
Как удалить все записи в базе данных и полностью ее инициализировать, включая первичные ключи, при переустановке приложения в Android Room?
Исключение Apache SSHD из-за отсутствия определенного домашнего каталога пользователя
Использование сериализации Kotlin Kotlinx с дженериками
Получение API возвращает массив массивов вместо массива объектов с использованием Retrofit и Gson
Временная блокировка при использовании диспетчера учетных данных для входа в Google
Циклическая зависимость между следующими задачами после обновления плагина Gradle и плагина Firebase Crashlytics