2017-03-06 2 views
1

J'ai besoin d'utiliser la bibliothèque bouncycastle provider dans mon projet.Erreur, y compris le fournisseur de bouncycastle

Je l'ai inclus le projet Gradle.

apply plugin: 'application' 
sourceCompatibility = '1.6' 
version = '1.0.0' 
mainClassName = 'path.to.main.file' 

    dependencies { 
     compile "org.mariadb.jdbc:mariadb-java-client:+" 
     compile "org.bouncycastle:bcprov-jdk16:+" 
     compile "commons-codec:commons-codec:+" 
     testCompile "junit:junit:+" 
    } 

Le projet a abouti. Mais quand j'essaie de lancer le projet. Il ne peut pas trouver le bouncycastle

Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider 
    at com.example.Server.main(Server.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider 
    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) 
    ... 6 more 

Comment puis-je résoudre ce problème?

+0

Mauvaise dépendance. Il n'y a pas de bcprov-jdk16. Il devrait être bcprov-jdk15on –

+0

@JamesKPolk vous avez tort, il y a. Jusqu'à la version 1.46, donc il y a quelque chose trouvé. Dans les versions récentes pas encore, comme je l'ai écrit ci-dessous déjà. – Vampire

+0

Avez-vous trouvé une solution à votre problème? – Exception

Répondre

1

BouncyCastle doit être enregistré en tant que fournisseur de sécurité

Security.addProvider(new BouncyCastleProvider()); 
+1

C'est très probablement ce qu'il fait et quand il reçoit l'erreur. Il ne définit probablement pas son chemin de classe lors de l'exécution. – Vampire

+1

Oui. J'ai fait cela 'Security.addProvider (nouveau org.bouncycastle.jce.provider.BouncyCastleProvider());' – mjm

+0

@Vampire Oui. Vous avez certainement raison. L'ajout du fournisseur BouncyCastle échoue avec une erreur qui ne parvient pas à trouver le fournisseur "BC", pas une erreur NoClassDefFound –

2

Vous avez probablement ne pas exécuter correctement votre application.
Si vous exécutez simplement le fichier JAR créé avec java -jar foo.jar, toutes les dépendances à l'exécution sont manquantes.
Vous devez ajouter ces dépendances à votre chemin de classe.

Vous avez plusieurs façons de le faire.
E. g. vous pouvez créer un gros JAR où toutes les dépendances sont réemballées dans le JAR final avec un plugin Gradle (il y en a plusieurs, mais je n'aime pas du tout cette solution, donc je ne peux pas en recommander une).
Ou vous pouvez e. g. appliquez le plugin application, puis utilisez la tâche run pour exécuter correctement votre application et utilisez la tâche distZip pour obtenir un ZIP de distribution prêt à l'emploi avec votre application, toutes les dépendances et les scripts de démarrage qui définissent correctement le classpath runtime.
Ou vous pouvez e. g. faites-le manuellement avec java -cp foo.jar;other.jar;another.jar your.main.Class.

+0

J'ai modifié la question. Pourtant, j'ai la même erreur. J'ai fait le plugin à 'application' et spécifié le chemin vers le fichier principal. – mjm

+0

Mais vous faites toujours 'java -jar foo.jar', n'est-ce pas? Ce n'est pas ce que je vous ai dit et ce que la documentation du plugin 'application' vous dit. – Vampire

+0

J'utilise la tâche 'run' dans' Android Studio' pour exécuter l'application. – mjm