standard - java eclipse oxygen
La importaciĆ³n de sun.misc.BASE64Encoder produce un error compilado en Eclipse (12)
- Vaya a la configuración de la ruta de compilación en las propiedades del proyecto.
- Eliminar la biblioteca del sistema JRE
- Añadir de nuevo; Seleccione "Agregar biblioteca" y seleccione la biblioteca del sistema JRE. El defecto funcionó para mí.
Esto funciona porque tienes varias clases en diferentes archivos jar. Eliminar y volver a agregar jre lib hará que las clases correctas sean las primeras. Si desea una solución fundamental, asegúrese de excluir los archivos jar con las mismas clases.
Para esto dos importaciones;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
Tengo este error
Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:/Program Files/Java/jre6/lib/rt.jar
¿Cómo puedo resolver este error?
Agrega el archivo base64decoder jar y prueba estas importaciones:
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;
Claro, simplemente no uses el codificador / decodificador Sun base64. Hay muchas otras opciones disponibles, incluyendo commons.apache.org/codec o esta implementación de dominio público .
Luego lee por qué no debes usar los paquetes de sol. * .
Ese error es causado por su configuración de Eclipse. Puedes reducirlo a una advertencia. Mejor aún , use un codificador Base64 que no sea parte de una API no pública. Apache Commons tiene one , o cuando ya está en Java 1.8, use java.util.Base64
.
Este error (o advertencia en versiones posteriores) se produce porque está compilando en un entorno de ejecución de Java. Esto se muestra como la JRE System library [CDC-1.0/Foundation-1.0]
en la ruta de compilación de su proyecto Eclipse Java. Estos entornos solo exponen la API estándar de Java en lugar de todas las clases dentro del tiempo de ejecución. Esto significa que las clases utilizadas para implementar la API estándar de Java no están expuestas.
Puede permitir el acceso a estas clases particulares utilizando reglas de acceso, puede configurar Eclipse para que use el JDK directamente o puede desactivar el error. Sin embargo, estaría ocultando un error grave, ya que las clases internas de Sun no deberían utilizarse (consulte a continuación una breve explicación).
Java contiene una Base64 en la API estándar desde Java 1.8. Vea a continuación un ejemplo de cómo usarlo:
Declaración de importación de Java 8:
import java.util.Base64;
Código de ejemplo de 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 no está disponible, se debe utilizar una biblioteca como Apache Commons Codec o Guava .
No se deben usar clases internas de sol . Esas clases se utilizan para implementar Java. Tienen métodos públicos para permitir la creación de instancias de otros paquetes. Sin embargo, un buen entorno de construcción debería protegerlo de su uso.
El uso de clases internas puede romper la compatibilidad con futuros tiempos de ejecución de Java SE; La implementación y ubicación de estas clases puede cambiar en cualquier momento. Se debe desaconsejar encarecidamente desactivar el error o la advertencia.
Este error se debe a que está importando a continuación dos clases import sun.misc.BASE64Encoder; importar sun.misc.BASE64Decoder ;. Maybe you are using encode and decode of that library like below.
new BASE64Encoder().encode(encVal);
newBASE64Decoder().decodeBuffer(encryptedData);
Sí, en lugar de sun.misc.BASE64Encoder puede importar la clase java.util.Base64 . Ahora cambie el método de codificación anterior como se muestra a continuación
encryptedData=Base64.getEncoder().encodeToString(encryptedByteArray);
Ahora cambia el método de decodificación anterior de la siguiente manera
byte[] base64DecodedData = Base64.getDecoder().decode(base64EncodedData);
Ahora que todo está hecho, puedes guardar tu programa y ejecutarlo. Se ejecutará sin mostrar ningún error.
Estoy usando el sistema Unix.
En eclipse project-> Properties -> Java Compiler -> Errors / Warning -> Forbidden Access (regla de acceso) -> Gírelo a warning / Ignore (Anteriormente estaba configurado como Error).
Java 6 envía el javax.xml.bind.DatatypeConverter
. Esta clase proporciona dos métodos estáticos que admiten la misma decodificación y codificación:
parseBase64Binary() / printBase64Binary()
Actualización: desde Java 8 ahora tenemos un soporte Base64 mucho mejor.
Use esto y no necesitará una biblioteca adicional, como Apache Commons Codec
.
Sé que este es un post muy antiguo. Como no tenemos nada de sun.misc en maven, podemos usarlo fácilmente.
StringUtils.newStringUtf8 (Base64.encodeBase64 (encVal)); Desde org.apache.commons.codec.binary.Base64
Sí, y sun.misc.BASE64Decoder es mucho más lento: 9x más lento que java.xml.bind.DatatypeConverter.parseBase64Binary () y 4x más lento que org.apache.commons.codec.binary.Base64.decodeBase64 (), al menos para un cadena pequeña en Java 6 OSX.
A continuación se muestra el programa de prueba que utilicé. Con Java 1.6.0_43 en OSX:
john:password = am9objpwYXNzd29yZA==
javax.xml took 373: john:password
apache took 612: john:password
sun took 2215: john:password
Por cierto que es con commons-codec 1.4. Con 1.7 parece que se vuelve más lento:
javax.xml took 377: john:password
apache took 1681: john:password
sun took 2197: john:password
No probé Java 7 u otro sistema operativo.
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);
}
}
}
Tuve este problema en jdk1.6.0_37. Este es el único JDE / JRE en mi sistema. No sé por qué, pero lo siguiente resolvió el problema:
Proyecto -> Propiedades -> Java Build Path -> Bibliotecas
Cambie el botón de radio del entorno de ejecución a Alernate JRE . Esto selecciona el mismo jdk1.6.0_37, pero después de limpiar / compilar, el error de compilación desapareció.
Tal vez la aclaración en la respuesta del carnero (16 de marzo a las 9:00) tenga que ver con eso.
Vaya a Ventana -> Preferencias -> Java -> Compilador -> Error / Advertencias.
Seleccione API obsoleta y restringida . Cambie a la advertencia.
Cambie las referencias prohibidas y desalentadas y cámbiela a advertencia. (o como su necesidad.)