Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AutoFirma no inicia con OpenJDK Java 17 #244

Open
narcisgarcia opened this issue Feb 11, 2022 · 13 comments
Open

AutoFirma no inicia con OpenJDK Java 17 #244

narcisgarcia opened this issue Feb 11, 2022 · 13 comments

Comments

@narcisgarcia
Copy link

Entorno: Debian GNU/Linux 11 Stable (bullseye) arquitectura amd64.

Con la versión 11 de Java la aplicación AutoFirma abre correctamente, pero con la 17 (disponible de bullseye-backports) no:

$ AutoFirma 
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit
	at java.desktop/java.awt.Color.<clinit>(Color.java:277)
	at es.gob.afirma.standalone.LookAndFeelManager.<clinit>(LookAndFeelManager.java:60)
	at es.gob.afirma.standalone.SimpleAfirma.main(SimpleAfirma.java:569)
@manueldeljesus
Copy link

A mí me da el mismo error en Fedora 35.

Ahora bien, con Java ando más perdido que un pulpo en un garaje, así que no sé si la que tengo es la versión 11, o la 18.9. Copio abajo la información para el que la sepa descifrar.

openjdk 11.0.13 2021-10-19
OpenJDK Runtime Environment 18.9 (build 11.0.13+8)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8, mixed mode, sharing)

El problema me lo está dando AutoFirma 1.7.1, pero la 1.6.5 me lo dio también -por eso intenté actualizar-.

@narcisgarcia
Copy link
Author

Yo miro así la versión:

$ java --version
openjdk 11.0.13 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 11.0.13+8-post-Debian-1deb11u1, mixed mode, sharing)

@manueldeljesus
Copy link

Sí, sí, yo también, pero si miras la salida de mi comando, aparecerían dos números de versión, el 11 y el 18.9. Por eso decía que con Java nunca estoy seguro de cuál es el número de versión de verdad. 😅

@acuartango
Copy link

Hola,
En Ubuntu (Imagino que en Fedora también) se la versión se mira con con un solo guión:
java -version

Y para dejar por defecto una versión concreta de java debes ejecutar (tanto en Fedora como en Ubuntu):
sudo alternatives --config java

Te aparecerá una lista con todos los Java instalados en tu sistema y escribiendo el número que aparece a la izquierda de cada vesrión de Java, eliges cual quieres dejar por defecto.

En Ubuntu, con la última versión de Autofirma instalada y firmando contra una versión antigua y sin parchear del Portafirmas de la AGE (Versión: 5.0.7 ), solo me funciona con Java 11.

Hay que tener en cuenta que también importa si firmas en un portafirmas antiguo y sin parchear, que puede dar problemas con navegadores, o con el cliente de Autofirma si no está actualizado.

Si vas a firmar en una página actualizada, con poner Java 11 por defecto, e instalar la última versión de Autofirma, y seleccionar tu certificado escogiendo "Almacén de certificados del sistema" (icono pequeñito que aparece en la ventana de firma), podrás firmar.

A todo esto, si usas una tarjeta smartcard con chip como el DNIe u otra similar de otra entidad certificadora, deberás tener instalado el Kit de uso de esa entidad certificadora y te deberá funcionar bien el lector de tarjetas de tu equipo. Si encontraras problemas con esto, comenta con qué tipo de tarjeta tienes problemas y el que controle de ese tipo de tarjetas te pasará la información para hacerla funcionar.

@manueldeljesus
Copy link

A mí directamente no me abre, así que ya no es cuestión del almacén de firmas. Simplemente no llega ni a crear la ventana.

Si a ti la última versión te abre en Ubuntu, querrá decir que falta alguna dependencia en el RPM de Fedora, o quizá falta algún script de configuración.

@narcisgarcia
Copy link
Author

¿Y qué ocurre si necesitas tener otra versión de Java por defecto?
AutoFirma no es la única aplicación necesaria en el equipo, y a menudo hay otras que usan Java (como LibreOffice por poner un ejemplo)

En Python también suelen aparecer problemas con la versión por defecto v2 o v3) y las aplicaciones deben estar desarrolladas una de dos:

  • A) Compatibles con las diferentes versiones del intérprete
  • B) Especificando la versión de ejecución, bien sea en el Shebang o bien con un script de lanzamiento que la elige.

@educandogeek
Copy link

educandogeek commented Sep 5, 2022

A mí me da el mismo error en Fedora 35.

Ahora bien, con Java ando más perdido que un pulpo en un garaje, así que no sé si la que tengo es la versión 11, o la 18.9. Copio abajo la información para el que la sepa descifrar.

openjdk 11.0.13 2021-10-19
OpenJDK Runtime Environment 18.9 (build 11.0.13+8)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8, mixed mode, sharing)

El problema me lo está dando AutoFirma 1.7.1, pero la 1.6.5 me lo dio también -por eso intenté actualizar-.

Yo he sufrido el mismo error en Fedora 36. La solución ha sido:
1.- Instalar java-11-openjdk
2.- Como tengo la versión java-17-openjdk lo que hay que hacer es establecer que el sistema use java-11-openjdk para ello desde la terminal ejecutamos sudo alternatives --config java y escribimos el número correspondiente a java-11-openjdk (2 en mi caso)
Y ya está, con esto ya os va a arrancar autofirma sin ningún problema.
Estas webs me han dado la pista para solucionar el problema:

@Gamuci
Copy link
Contributor

Gamuci commented Sep 20, 2022

Hola:

En un principio no hay incompatibilidades de AutoFirma con OpenJDK 17. El problema que señala @narcisgarcia (java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit) se da cuando se ejecuta AutoFirma con una JRE que no tiene las clases para interfaces gráficas. Estas JRE suelen ir marcadas como "headless" o "server" y a menudo son las que se instalan desde algunos repositorios de software de Linux. No recuerdo si es el caso de Fedora. Podéis probar a descargaros una JRE de OpenJDK 17 directamente de internet (por ejemplo, de Adoptium) y ejecutar AutoFirma con ella.

Tanto para hacer una prueba con una JRE concreta como para hacer que AutoFirma se ejecute con una JRE distinta de la que tenemos configurada en las variables PATH o el JAVA_HOME, se puede modificar el fichero /usr/bin/autofirma para sustituir el comando de invocación de AutoFirma:

java -jar /usr/lib/AutoFirma/AutoFirma.jar $*

En su lugar usaremos el mismo, pero indicando la ruta concreta de la JRE que deseamos utilizar. Por ejemplo:

/usr/lib/jdk-11.0.13+8/bin/java -jar /usr/lib/AutoFirma/AutoFirma.jar $*

Probablemente (según la distribución que uséis) también se tenga que hacer lo mismo en /usr/share/applications/autofirma.desktop.

Un saludo.

@educandogeek
Copy link

Hola:

En un principio no hay incompatibilidades de AutoFirma con OpenJDK 17. El problema que señala @narcisgarcia (java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit) se da cuando se ejecuta AutoFirma con una JRE que no tiene las clases para interfaces gráficas. Estas JRE suelen ir marcadas como "headless" o "server" y a menudo son las que se instalan desde algunos repositorios de software de Linux. No recuerdo si es el caso de Fedora. Podéis probar a descargaros una JRE de OpenJDK 17 directamente de internet (por ejemplo, de Adoptium) y ejecutar AutoFirma con ella.

Tanto para hacer una prueba con una JRE concreta como para hacer que AutoFirma se ejecute con una JRE distinta de la que tenemos configurada en las variables PATH o el JAVA_HOME, se puede modificar el fichero /usr/bin/autofirma para sustituir el comando de invocación de AutoFirma:

java -jar /usr/lib/AutoFirma/AutoFirma.jar $*

En su lugar usaremos el mismo, pero indicando la ruta concreta de la JRE que deseamos utilizar. Por ejemplo:

/usr/lib/jdk-11.0.13+8/bin/java -jar /usr/lib/AutoFirma/AutoFirma.jar $*

Probablemente (según la distribución que uséis) también se tenga que hacer lo mismo en /usr/share/applications/autofirma.desktop.

Un saludo.

Pues tienes razón. Me he fijado que en Fedora 36 yo tenía instalado solamente el OpenJDK 17 headless. He instalado el openjdk17 completo y ahora puedo ejecutar Autofirma. Me aparece un aviso de compatibilidad con la version 17 de openjdk pero me ha funcionado sin mayor problema.
Muchas gracias.

@sarroutbi
Copy link

sudo alternatives --config java

Muchas gracias por apuntarlo. Efectiva

A mí me da el mismo error en Fedora 35.
Ahora bien, con Java ando más perdido que un pulpo en un garaje, así que no sé si la que tengo es la versión 11, o la 18.9. Copio abajo la información para el que la sepa descifrar.

openjdk 11.0.13 2021-10-19
OpenJDK Runtime Environment 18.9 (build 11.0.13+8)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8, mixed mode, sharing)

El problema me lo está dando AutoFirma 1.7.1, pero la 1.6.5 me lo dio también -por eso intenté actualizar-.

Yo he sufrido el mismo error en Fedora 36. La solución ha sido: 1.- Instalar java-11-openjdk 2.- Como tengo la versión java-17-openjdk lo que hay que hacer es establecer que el sistema use java-11-openjdk para ello desde la terminal ejecutamos sudo alternatives --config java y escribimos el número correspondiente a java-11-openjdk (2 en mi caso) Y ya está, con esto ya os va a arrancar autofirma sin ningún problema. Estas webs me han dado la pista para solucionar el problema:

* https://iranzo.io/blog/2021/09/09/autofirma-en-linux/

* https://deskinsight.net/es/como-instalar-java-17-en-fedora-35-34-y-centos-rhel-8

Muchas gracias por el apunte. En mi caso, con bajar a openjdk-11 me ha funcionado (estoy utilizando Fedora 37). Se puede utilizar openjdk-17 (si no es el headless), pero Autofirma se queja de que no es una versión soportada, así que hacer el downgrade a la 11 parece ser lo más recomendado.

Un saludo y gracias de nuevo

@narcisgarcia
Copy link
Author

narcisgarcia commented Mar 1, 2023

Gracias @Gamuci pero: En Debian el paquete openjdk-17-jre depende de openjdk-17-jre-headless.
Esto significa que al instalar el paquete completo (como yo ya hacía), tanto se instalan los componentes gráficos como los componentes autónomos (headless). De otro modo la incidencia también me hubiera ocurrido con openjdk-11.

Parece que hubo alguna corrección con la versión 1.7.1 de AutoFirma, porque ahora lo probé de nuevo y por lo menos la aplicación arranca, aunque con la advertencia:
«AutoFirma se está ejecutando con Java 17.0.6. Esta versión no está oficialmente soportada y pueden producirse errores durante su ejecución
Probé la funcionalidad y todo parece resultar bien.

Evidentemente, en Debian y la mayoría de distribuciones, lo que hay que instalar es el paquete de la distribución, que está muy bien preparado para no dar problemas en su entorno.

@narcisgarcia
Copy link
Author

Prepárense porque la versión 18 de OpenJDK está publicada desde hace casi un año.
En los repositorios de Debian (y muchas distribuciones) se están preparando los paquetes openjdk-18-jre y derivados.
Esperemos que AutoFirma pronto esté revisada con Java 17 y Java 18 y no haga falta ninguna advertencia de errores.

@nbenitez
Copy link

En un principio no hay incompatibilidades de AutoFirma con OpenJDK 17. El problema que señala @narcisgarcia (java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit) se da cuando se ejecuta AutoFirma con una JRE que no tiene las clases para interfaces gráficas. Estas JRE suelen ir marcadas como "headless" o "server" y a menudo son las que se instalan desde algunos repositorios de software de Linux. No recuerdo si es el caso de Fedora.

Efectivamente ese era el problema. En Fedora 38 viene instalada por defecto java-17-openjdk-headless por lo que simplemente hay que instalar la versión normal para que funcione:
sudo dnf install java-17-openjdk

LucasFA added a commit to LucasFA/clienteafirma that referenced this issue Nov 4, 2023
Exige la existencia de alguna librería de Java >= 11 sin exigir
ninguna versión o proveedor particular.

En el issue ctt-gob-es#259 se nos motiva por qué no se exige ninguna dependencia
de Java para la instalación: hay usarios que no quieren instalarse
ninguna otra versión que la que ya tienen.

Esto provoca mucho quebraderos de cabeza para usuarios que se instalan
Autofirma sin leerse las instrucciones, acabando con instalaciones
rotas - no es intuitivo para el usuario instalarse las dependencias
manualmente.

Para conciliar esto utilizamos los virtual packages de
Debian: se supone que un paquete que da la funcionalidad
de un JRE 11 debería de declarar en la sección Provides: del paquete que
aporta java11-runtime.

Si no hay ningún paquete que ya provea al sistema de un runtime de Java
compatible con las versiones 11 o 17, se instala default-jre, versión >= 11.

Nótese que para que dpkg tenga conocimiento de esa instalación previa de
Java, debe de haberse instalado también con dpkg o apt. Según de cómo de
acomodador se quiera ser a los usuarios con su instalación custom
de Java fuera de dpkg, esto podría ser un breaking change para ellos. En
mi opinión, este es un uso menor, viendo la cantidad de comentarios de
la comunidad al respecto, como veremos.

Así se resuelven muchos problemas de instalación:
- un usuario en ctt-gob-es#16 estuvo días con problemas por no tener Java (no el
  posteador)
- resolves ctt-gob-es#244, donde varios usuarios vieron su problema resuelto
  gracias a una aclaración indicando su problema con las dependencias.
- closes ctt-gob-es#258, que simplemente pregunta desconcertado.
- En ctt-gob-es#263, al menos un usuario reporta haber solucionado su problema
  instalando Java de Oracle.
- En ctt-gob-es#250, al final del hilo, un usuario reporta que el funcionamiento o
  no de Autofirma varía de versión a versión.
- close ctt-gob-es#259, el issue mencionado al principio de este commit message.
- tenemos un tutorial/explicación y todo en ctt-gob-es#302

También está la PR ctt-gob-es#268, que pide aclarar la instalación para Fedora,
que sufre de exactamente lo mismo. De hecho:
- ctt-gob-es#230 y ctt-gob-es#355 parecen ser tambien problemas de tener instalado java
  headless (el log errores menciona java.awt, abstract window toolkit).
  Otros 2 usuarios reportaban errores similares en ctt-gob-es#172, y otro usuario
  en ctt-gob-es#168 sabe que tiene headless pero no que necesita las versión no
  headless.

Referencias:
https://wiki.debian.org/Java - sección Understanding Java Virtual
packages names.
La misma idea de usar virtual package names surge en
varias preguntas de StackOverflow:
- Depender de Java pero no de ninguna implementación particular https://unix.stackexchange.com/questions/291783/can-i-indicate-that-a-deb-package-depends-on-java-but-not-specify-what-impleme
- Depender de Java pero sin ser estricto en versiones
  https://unix.stackexchange.com/questions/550060/set-minimal-jre-version-to-deb-package-dependency
  y https://stackoverflow.com/questions/36181613/how-to-configure-java-7-or-java-8-dependency-in-debian-deb-package
LucasFA added a commit to LucasFA/clienteafirma that referenced this issue Nov 4, 2023
Exige la existencia de alguna librería de Java >= 11 sin exigir
ninguna versión o proveedor particular.

En el issue ctt-gob-es#259 se nos motiva por qué no se exige ninguna dependencia
de Java para la instalación: hay usarios que no quieren instalarse
ninguna otra versión que la que ya tienen.

Esto provoca mucho quebraderos de cabeza para usuarios que se instalan
Autofirma sin leerse las instrucciones, acabando con instalaciones
rotas - no es intuitivo para el usuario instalarse las dependencias
manualmente.

Para conciliar esto utilizamos los virtual packages de
Debian: se supone que un paquete que da la funcionalidad
de un JRE 11 debería de declarar en la sección Provides: del paquete que
aporta java11-runtime.

Si no hay ningún paquete que ya provea al sistema de un runtime de Java
compatible con las versiones 11 o 17, se instala default-jre, versión >= 11.

Nótese que para que dpkg tenga conocimiento de esa instalación previa de
Java, debe de haberse instalado también con dpkg o apt. Según de cómo de
acomodador se quiera ser a los usuarios con su instalación custom
de Java fuera de dpkg, esto podría ser un breaking change para ellos. En
mi opinión, este es un uso menor, viendo la cantidad de comentarios de
la comunidad al respecto, como veremos.

Así se resuelven muchos problemas de instalación:
- un usuario en ctt-gob-es#16 estuvo días con problemas por no tener Java (no el
  posteador)
- resolves ctt-gob-es#244, donde varios usuarios vieron su problema resuelto
  gracias a una aclaración indicando su problema con las dependencias.
- closes ctt-gob-es#258, que simplemente pregunta desconcertado.
- En ctt-gob-es#263, al menos un usuario reporta haber solucionado su problema
  instalando Java de Oracle.
- En ctt-gob-es#250, al final del hilo, un usuario reporta que el funcionamiento o
  no de Autofirma varía de versión a versión.
- close ctt-gob-es#259, el issue mencionado al principio de este commit message.
- tenemos un tutorial/explicación y todo en ctt-gob-es#302

También está la PR ctt-gob-es#268, que pide aclarar la instalación para Fedora,
que sufre de exactamente lo mismo. De hecho:
- ctt-gob-es#230 y ctt-gob-es#355 parecen ser tambien problemas de tener instalado java
  headless (el log errores menciona java.awt, abstract window toolkit).
  Otros 2 usuarios reportaban errores similares en ctt-gob-es#172, y otro usuario
  en ctt-gob-es#168 sabe que tiene headless pero no que necesita las versión no
  headless.

Referencias:
https://wiki.debian.org/Java - sección Understanding Java Virtual
packages names.
La misma idea de usar virtual package names surge en
varias preguntas de StackOverflow:
- Depender de Java pero no de ninguna implementación particular https://unix.stackexchange.com/questions/291783/can-i-indicate-that-a-deb-package-depends-on-java-but-not-specify-what-impleme
- Depender de Java pero sin ser estricto en versiones
  https://unix.stackexchange.com/questions/550060/set-minimal-jre-version-to-deb-package-dependency
  y https://stackoverflow.com/questions/36181613/how-to-configure-java-7-or-java-8-dependency-in-debian-deb-package
LucasFA added a commit to LucasFA/clienteafirma that referenced this issue Nov 4, 2023
Exige la existencia de alguna librería de Java >= 11 sin exigir
ninguna versión o proveedor particular.

En el issue ctt-gob-es#259 se nos motiva por qué no se exige ninguna dependencia
de Java para la instalación: hay usarios que no quieren instalarse
ninguna otra versión que la que ya tienen.

Esto provoca mucho quebraderos de cabeza para usuarios que se instalan
Autofirma sin leerse las instrucciones, acabando con instalaciones
rotas - no es intuitivo para el usuario instalarse las dependencias
manualmente.

Para conciliar esto utilizamos los virtual packages de
Debian: se supone que un paquete que da la funcionalidad
de un JRE 11 debería de declarar en la sección Provides: del paquete que
aporta java11-runtime.

Si no hay ningún paquete que ya provea al sistema de un runtime de Java
compatible con las versiones 11 o 17, se instala default-jre, versión >= 11.

Nótese que para que dpkg tenga conocimiento de esa instalación previa de
Java, debe de haberse instalado también con dpkg o apt. Según de cómo de
acomodador se quiera ser a los usuarios con su instalación custom
de Java fuera de dpkg, esto podría ser un breaking change para ellos. En
mi opinión, este es un uso menor, viendo la cantidad de comentarios de
la comunidad al respecto, como veremos.

Así se resuelven muchos problemas de instalación:
- un usuario en ctt-gob-es#16 estuvo días con problemas por no tener Java (no el
  posteador)
- resolves ctt-gob-es#244, donde varios usuarios vieron su problema resuelto
  gracias a una aclaración indicando su problema con las dependencias.
- closes ctt-gob-es#258, que simplemente pregunta desconcertado.
- En ctt-gob-es#263, al menos un usuario reporta haber solucionado su problema
  instalando Java de Oracle.
- En ctt-gob-es#250, al final del hilo, un usuario reporta que el funcionamiento o
  no de Autofirma varía de versión a versión.
- close ctt-gob-es#259, el issue mencionado al principio de este commit message.
- tenemos un tutorial/explicación y todo en ctt-gob-es#302

También está la PR ctt-gob-es#268, que pide aclarar la instalación para Fedora,
que sufre de exactamente lo mismo. De hecho:
- ctt-gob-es#230 y ctt-gob-es#355 parecen ser tambien problemas de tener instalado java
  headless (el log errores menciona java.awt, abstract window toolkit).
  Otros 2 usuarios reportaban errores similares en ctt-gob-es#172, y otro usuario
  en ctt-gob-es#168 sabe que tiene headless pero no que necesita las versión no
  headless.

Referencias:
https://wiki.debian.org/Java - sección Understanding Java Virtual
packages names.
La misma idea de usar virtual package names surge en
varias preguntas de StackOverflow:
- Depender de Java pero no de ninguna implementación particular https://unix.stackexchange.com/questions/291783/can-i-indicate-that-a-deb-package-depends-on-java-but-not-specify-what-impleme
- Depender de Java pero sin ser estricto en versiones
  https://unix.stackexchange.com/questions/550060/set-minimal-jre-version-to-deb-package-dependency
  y https://stackoverflow.com/questions/36181613/how-to-configure-java-7-or-java-8-dependency-in-debian-deb-package
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants