web-dev-qa-db-fra.com

l'importation de Sun.misc.BASE64Encoder entraîne une erreur compilée dans Eclipse

Pour cela deux importations;

import Sun.misc.BASE64Encoder;
import Sun.misc.BASE64Decoder;

J'ai eu cette erreur:

Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar

Comment puis-je résoudre cette erreur?

59
karikari

Cette erreur est causée par votre configuration Eclipse. Vous pouvez le réduire à un avertissement. Encore mieux , utilisez un encodeur Base64 qui ne fait pas partie d'une API non publique. Apache Commons utilise one , ou lorsque vous utilisez déjà Java 1.8, utilisez Java.util.Base64 .

57
user207421

Allez dans Fenêtre -> Préférences -> Java -> Compilateur -> Erreur/Avertissements.
Sélectionnez API obsolète et restreinte . Changez-le en warning.
Modifier interdit et Déconseillé Référence et remplacez-le par warning. (ou selon vos besoins.)

121
nIKUNJ

Bien sûr, n'utilisez pas l'encodeur/décodeur Sun base64. Il existe de nombreuses autres options disponibles, notamment Apache Codec ou this implémentation du domaine public .

Ensuite, lisez pourquoi vous ne devriez pas utiliser les packages Sun. * .

34
Jon Skeet

Java 6 expédie le javax.xml.bind.DatatypeConverter. Cette classe fournit deux méthodes statiques prenant en charge les mêmes décodages et encodages:

parseBase64Binary() / printBase64Binary()

Mise à jour: Depuis Java 8, nous avons maintenant un meilleur support Base64 .

Utilisez ceci et vous n’avez pas besoin d’une bibliothèque supplémentaire, comme Apache Commons Codec.

24
StaticBR

Oui, et Sun.misc.BASE64Decoder est beaucoup plus lent: 9 fois plus lent que Java.xml.bind.DatatypeConverter.parseBase64Binary () et 4x plus lent que org.Apache.commons.codec.binary.Base64.decodeBase64 (), au moins pour petite chaîne sur Java 6 OSX.

Ci-dessous, le programme de test que j'ai utilisé. Avec Java 1.6.0_43 sur OSX:

john:password = am9objpwYXNzd29yZA==
javax.xml took 373: john:password
Apache took    612: john:password
Sun took       2215: john:password

Btw c'est avec commons-codec 1.4. Avec 1.7, cela semble devenir plus lent:

javax.xml took 377: john:password
Apache took    1681: john:password
Sun took       2197: john:password

N'a pas testé Java 7 ou un autre système d'exploitation.

import javax.xml.bind.DatatypeConverter;
import org.Apache.commons.codec.binary.Base64;
import Java.io.IOException;

public class TestBase64 {
    private static volatile String save = null;
    public static void main(String argv[]) {
        String teststr = "john:password";
        String b64 = DatatypeConverter.printBase64Binary(teststr.getBytes());
        System.out.println(teststr + " = " + b64);
        try {
            final int COUNT = 1000000;
            long start;
            start = System.currentTimeMillis();
            for (int i=0; i<COUNT; ++i) {
                save = new String(DatatypeConverter.parseBase64Binary(b64));
            }
            System.out.println("javax.xml took "+(System.currentTimeMillis()-start)+": "+save);
            start = System.currentTimeMillis();
            for (int i=0; i<COUNT; ++i) {
                save = new String(Base64.decodeBase64(b64));
            }
            System.out.println("Apache took    "+(System.currentTimeMillis()-start)+": "+save);
            Sun.misc.BASE64Decoder dec = new Sun.misc.BASE64Decoder();
            start = System.currentTimeMillis();
            for (int i=0; i<COUNT; ++i) {
                save = new String(dec.decodeBuffer(b64));
            }
            System.out.println("Sun took       "+(System.currentTimeMillis()-start)+": "+save);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
5
jamshid

J'ai eu ce problème sur jdk1.6.0_37 . C'est le seul JDE/JRE sur mon système. Je ne sais pas pourquoi, mais ce qui suit a résolu le problème:

Projet -> Propriétés -> Chemin de construction Java -> Bibliothèques

Basculez le bouton radio de Environnement d'exécution à Alernate JRE . Ceci sélectionne le même jdk1.6.0_37, mais l’erreur de compilation disparaît après nettoyage/compilation.

Peut-être que la clarification de ram (le 16 mars à 9 heures) doit faire quelque chose avec cela.

5
user2622016

Cette erreur (ou cet avertissement dans les versions ultérieures) se produit car vous compilez avec un environnement d'exécution Java. Ceci apparaît sous la forme JRE System library [CDC-1.0/Foundation-1.0] dans le chemin de génération de votre projet Java Eclipse. De tels environnements n'exposent que l'API standard Java au lieu de toutes les classes du runtime. Cela signifie que les classes utilisées pour implémenter l'API standard Java ne sont pas exposées.

Vous pouvez autoriser l'accès à ces classes particulières à l'aide de règles d'accès, configurer Eclipse pour utiliser directement le JDK ou désactiver l'erreur. Cependant, vous cachez une erreur grave car les classes internes de Sun ne doivent pas être utilisées (voir ci-dessous pour une brève explication).


Java contient un Base64 class dans l'API standard depuis Java 1.8. Voir ci-dessous pour un exemple d'utilisation:

Déclaration d'importation Java 8:

import Java.util.Base64;

Exemple de code Java 8:

// create a byte array containing data (test)
byte[] binaryData = new byte[] { 0x64, 0x61, 0x74, 0x61 };
// create and configure encoder (using method chaining) 
Base64.Encoder base64Encoder = Base64.getEncoder().withoutPadding();
// encode to string (instead of a byte array containing ASCII)
String base64EncodedData = base64Encoder.encodeToString(binaryData);

// decode using a single statement (no reuse of decoder)
// NOTE the decoder won't fail because the padding is missing
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);

Si Java 8 n'est pas disponible, une bibliothèque telle que Apache Commons Codec ou Guava doit être utilisée.


Les classes internes de Sun ne doivent pas être utilisées . Ces classes sont utilisées pour implémenter Java. Ils ont des méthodes publiques pour permettre l'instanciation à partir d'autres packages. Un bon environnement de construction cependant devrait vous empêcher de les utiliser.

L'utilisation de classes internes peut rompre la compatibilité avec les environnements d'exécution Java SE futurs. l'implémentation et l'emplacement de ces classes peuvent changer à tout moment. Il est fortement déconseillé de désactiver l'erreur ou l'avertissement.

3
Maarten Bodewes
  1. Accédez aux paramètres du chemin de construction dans les propriétés du projet.
  2. Supprimer la bibliothèque système JRE
  3. Rajoutez-le Sélectionnez "Ajouter une bibliothèque" et sélectionnez la bibliothèque système JRE. Le défaut a fonctionné pour moi.

Cela fonctionne parce que vous avez plusieurs classes dans différents fichiers JAR. En supprimant et en rajoutant jre lib, les bonnes classes seront les premières. Si vous voulez une solution fondamentale, assurez-vous d’exclure les fichiers jar avec les mêmes classes.

2
ram

J'utilise un système Unix. 

Dans le projet Eclipse -> Propriétés -> Compilateur Java -> Erreurs/Avertissement -> Accès interdit (règle d'accès) -> Tournez-le sur avertissement/Ignorer (il était auparavant défini sur Erreur).

1
NehPraka

Cette erreur est due au fait que vous importez ci-dessous deux classes Import Sun.misc.BASE64Encoder; importer Sun.misc.BASE64Decoder; .Maybe you are using encode and decode of that library like below.

new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);

Ouais, au lieu de Sun.misc.BASE64Encoder, vous pouvez importer Classe Java.util.Base64 . Modifiez maintenant la méthode de codage précédente comme ci-dessous

encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);

Maintenant changez la méthode de décodage précédente comme ci-dessous

byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);

Maintenant que tout est terminé, vous pouvez enregistrer votre programme et le lancer. Il fonctionnera sans montrer aucune erreur.

0
PyDevSRS

Je sais que c'est très vieux post. Puisque nous n’avons rien de Sun.misc in maven .__, nous pouvons facilement utiliser 

StringUtils.newStringUtf8 (Base64.encodeBase64 (encVal)); ;__. De org.Apache.commons.codec.binary.Base64

0
Mohsin Khan

Ajoutez le fichier jar base64decoder et essayez les importations suivantes:

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
0
Rajesh Kumar Gupta