- Liittynyt
- 17.10.2016
- Viestejä
- 161
Java 1.8 + JavaFX + Mavenilla asennettu SSHJ.
Käyttöliittymän komponentit sisältävän luokan (Gui.java) konstruktorissa luodaan olio, joka sisältää SSHJ-kirjaston toiminallisuuksia. Kun sovellus suoritetaan, se kaatuu virheilmoitukseen:
Luodussa oliossa on eräs metodi, jota ei suoriteta ohjelman ajon missään vaiheessa. Metodista löytyy seuraava lause, johon ohjelman suoritus kaatuu:
Jos lause muutetaan lambda-muotoon, sovellus käynnistyy virheettä:
Miksi lambda-muodossa oleva lause toimii, mutta pitkässä muodossa oleva ei?
Käyttöliittymän komponentit sisältävän luokan (Gui.java) konstruktorissa luodaan olio, joka sisältää SSHJ-kirjaston toiminallisuuksia. Kun sovellus suoritetaan, se kaatuu virheilmoitukseen:
Koodi:
--- exec-maven-plugin:1.2.1:exec (default-cli) @ Testi ---
Exception in Application constructor
Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class personal.oma.Testi.Gui
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:819)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
... 1 more
Caused by: java.lang.NoClassDefFoundError: net/schmizz/sshj/transport/verification/HostKeyVerifier
at personal.oma.Testi.Gui.<init>(Gui.java:42)
... 13 more
Caused by: java.lang.ClassNotFoundException: net.schmizz.sshj.transport.verification.HostKeyVerifier
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 14 more
Luodussa oliossa on eräs metodi, jota ei suoriteta ohjelman ajon missään vaiheessa. Metodista löytyy seuraava lause, johon ohjelman suoritus kaatuu:
Koodi:
ssh = new SSHClient();
ssh.addHostKeyVerifier(
new HostKeyVerifier() {
@Override
public boolean verify(String s, int i, PublicKey publicKey) {
return true;
}
});
Koodi:
ssh = new SSHClient();
ssh.addHostKeyVerifier((String s, int i, PublicKey publicKey) -> true);
Miksi lambda-muodossa oleva lause toimii, mutta pitkässä muodossa oleva ei?