• Publicidad

Integrar Perl en Java

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Integrar Perl en Java

Notapor osurtni » 2007-01-08 12:52 @577

Hola, tengo una duda que espero sepáis responderla, estoy intentando integrar dentro de un mismo proyecto código Perl y Java, realmente me convendría más saber cómo llamar desde Java a código Perl pero no he encontrado nada al respecto, por lo que si alguno sabéis os agradecería mucho que me lo comentaseis.

Sí he encontrado información sobre cómo llamar desde Perl a código Java pero lo estoy intentando y tampoco lo consigo, no sé si cometo algún error a la hora de instalar el Inline::Java en el ppm (estoy trabajando en Win32 y con el eclipse) pero no consigo que me funcione el siguiente código:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;

use Inline Java => <<'EOJ';
public class Hi {

        String greeting;

        public Hi(String greeting) {
            this.greeting = greeting;            
        }

        public void setGreeting(String newGreeting) {
            greeting = newGreeting;
        }

        public String getGreeting() {
            return greeting;
        }
}
EOJ


my $greeter = Hi->new("Miguel");
print $greeter->getGreeting(), "\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Actualmente me da el siguiente error:

Código: Seleccionar todo
java.lang.UnsupportedClassVersionError: org/perl/inline/java/InlineJavaServer (Unsupported major.minor version 49.0)
   at java.lang.ClassLoader.defineClass0(Native Method)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
   at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
   at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
   at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Can't find class InlineJavaServer at C:/Perl/site/lib/Inline/Java/JVM.pm line 54.


Actualmente estoy un poco perdido por lo que os agradecería mucho toda ayuda que me pudierais prestar.

Un saludo!
osurtni
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-01-08 12:35 @566

Publicidad

Notapor explorer » 2007-01-08 13:44 @614

Bienvenido a los foros de Perl en Español.

El error dice que Inline::Java no ha encontrado la clase org.perl.inline.java.InlineJavaServer. Es muy posible que javac no haya podido encontrarlo porque CLASSPATH no ha sido actualizado con el directorio donde se encuentra org/perl/inline/java/.

Y para poder llamar a Perl desde Java, puedes hacer un System desde Java como si fueras a ejecutar cualquier otro programa, salvo que esta vez llamarás al intérprete perl.exe pasándole como parámetro el programa Perl a ejecutar.

Otra forma es usando Inline::Java::PerlInterpreter, aunque todavía es experimental.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Integrar Perl en Java

Notapor Perl user » 2007-01-08 18:26 @809

osurtni escribiste:Hola, tengo una duda que espero sepáis responderla, estoy intentando integrar dentro de un mismo proyecto código Perl y Java, realmente me convendría más saber cómo llamar desde Java a código Perl pero no he encontrado nada al respecto, por lo que si alguno sabéis os agradecería mucho que me lo comentaseis.

Sí he encontrado información sobre cómo llamar desde Perl a código Java pero lo estoy intentando y tampoco lo consigo, no sé si cometo algún error a la hora de instalar el Inline::Java en el ppm (estoy trabajando en Win32 y con el eclipse) pero no consigo que me funcione el siguiente código:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;

use Inline Java => <<'EOJ';
public class Hi {

        String greeting;

        public Hi(String greeting) {
            this.greeting = greeting;            
        }

        public void setGreeting(String newGreeting) {
            greeting = newGreeting;
        }

        public String getGreeting() {
            return greeting;
        }
}
EOJ


my $greeter = Hi->new("Miguel");
print $greeter->getGreeting(), "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Actualmente me da el siguiente error:

Código: Seleccionar todo
java.lang.UnsupportedClassVersionError: org/perl/inline/java/InlineJavaServer (Unsupported major.minor version 49.0)
   at java.lang.ClassLoader.defineClass0(Native Method)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
   at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
   at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
   at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Can't find class InlineJavaServer at C:/Perl/site/lib/Inline/Java/JVM.pm line 54.


Actualmente estoy un poco perdido por lo que os agradecería mucho toda ayuda que me pudierais prestar.

Un saludo!


Integrar Java sobre código de Perl es lo que haces con Inline::Java, tu problema puede ser que tu módulo de Inline::Java esté mal instalado. Ya que una UnsupportedClassVersionError generalmente es arrojada cuando una versión de bytecode no es compatible con la máquina virtual que estás utilizando, en este caso no es que Java no encuentre la clase, sino que ni siquiera se está generando un bytecode apropiado ya que no tienes la versión indicada. Intenta eliminando fisicamente el módulo y vuelve a instalarlo, también recuerda eliminar .Inline para borrar cualquier bytecode generado temporalmente.

Por otro lado, para ejecutar código de Perl en Java, bueno propiamente no se puede, lo que puedes hacer es ejecutar un script de Perl como un proceso (in)dependiente de Java (Runtime.exec o ProcessBuilder), como ya te indicaron arriba.

Pero si requieres pasar datos de un proceso en Perl a Java, tendrás que utilizar algun otro mecanismo para comunicación entre procesos. De lo contrario, si tu salida del script de Perl es muy sencilla, puedes arrojarla a STDOUT y con tu programa en Java analizar la salida.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer » 2007-01-08 18:37 @817

¡Hey!

¡Me ha funcionado!

He instalado Inline e Inline::Java v0.51 con el comando cpan. Inline::Java me ha dado un problema de instalación y he tenido que hacer el último paso a mano:
Código: Seleccionar todo
make java
make
make test (dos veces)
make install


Luego, he metido el código de osurtni y lo he ejecutado. Sale "Miguel" con un retorno de carro.

En la carpeta _Inline asociada tengo:
Código: Seleccionar todo
explorer@casa:~/Documents/Software/Perl> ll -R _Inline/
_Inline/:
total 6
drwxr-xr-x 5 explorer users 1784 ene  9 00:31 ..
drwxr-xr-x 3 explorer users   72 ene  9 00:31 lib
-rw-r--r-- 1 explorer users  317 ene  9 00:31 config
drwxr-xr-x 4 explorer users  120 ene  9 00:31 .
drwxr-xr-x 2 explorer users   48 ene  9 00:31 build

_Inline/lib:
total 0
drwxr-xr-x 3 explorer users  80 ene  9 00:31 auto
drwxr-xr-x 4 explorer users 120 ene  9 00:31 ..
drwxr-xr-x 3 explorer users  72 ene  9 00:31 .

_Inline/lib/auto:
total 0
drwxr-xr-x 3 explorer users  72 ene  9 00:31 ..
drwxr-xr-x 3 explorer users  80 ene  9 00:31 .
drwxr-xr-x 2 explorer users 136 ene  9 00:31 kk_pl_4e0b

_Inline/lib/auto/kk_pl_4e0b:
total 12
drwxr-xr-x 3 explorer users  80 ene  9 00:31 ..
-rw-r--r-- 1 explorer users 552 ene  9 00:31 kk_pl_4e0b.jdat
-rw-r--r-- 1 explorer users 595 ene  9 00:31 kk_pl_4e0b.inl
-rw-r--r-- 1 explorer users 407 ene  9 00:31 Hi.class
drwxr-xr-x 2 explorer users 136 ene  9 00:31 .

_Inline/build:
total 0
drwxr-xr-x 4 explorer users 120 ene  9 00:31 ..
drwxr-xr-x 2 explorer users  48 ene  9 00:31 .


La primera ejecución del código ha tardado unos segundos, pero las siguientes tardan uno o menos:
Código: Seleccionar todo
explorer@casa:~/Documents/Software/Perl> time ./kk.pl
Miguel

real    0m10.852s
user    0m1.608s
sys     0m0.296s
explorer@casa:~/Documents/Software/Perl> time ./kk.pl
Miguel

real    0m0.668s
user    0m0.480s
sys     0m0.064s

Nada, nada... una buena excusa para dejar el Perl y aprender Java :twisted:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-01-08 20:57 @915

Después de experimentar un poco, he llegado a la conclusión de que la instalación de Inline::Java no crea clases que han de ser incorporadas con la modificación del CLASSPATH, sino que a la compilación con javac se le añade las librerías de Inline::Java escritas en Java, para que las compile en ese momento.

Es decir, en mi instalación, Inline::Java ha creado los ficheros:
Código: Seleccionar todo
casa:~ # cat /usr/lib/perl5/site_perl/5.8.8/i586-linux-thread-multi/auto/Inline/Java/.packlist
/usr/lib/perl5/site_perl/5.8.8/Inline/Java.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java.pod
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Array.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Callback.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Callback.pod
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Class.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Handle.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/InlineJavaServer.jar
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/InlineJavaUser.jar
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/JNI.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/JVM.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Object.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Portable.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Protocol.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/Server.pm
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/default_j2sdk.pl
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaArray.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaCallback.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaCallbackQueue.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaCastException.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaClass.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaException.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaHandle.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaInvocationTargetException.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaPerlCaller.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaPerlException.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaPerlInterpreter.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaPerlNatives.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaPerlObject.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaProtocol.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaServer.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaServerThread.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaThrown.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaUserClassLink.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaUserClassLoader.java
/usr/lib/perl5/site_perl/5.8.8/Inline/Java/sources/org/perl/inline/java/InlineJavaUtils.java
/usr/share/man/man3/Inline::Java.3pm
/usr/share/man/man3/Inline::Java::Callback.3pm
Se observa que están todas las fuentes bajo sources/org/perl/inline/java/, pero dentro del directorio de instalación. Así que, en cada ejecución de Inline::Java, este módulo agrega estas fuentes a la compilación junto con nuestro código. No hay clases precompiladas.

En el caso de osurtni, entonces, me suena a una mala instalación. Comprueba que la disposición de los ficheros es igual. Ten en cuenta que estoy usando la versión 0.51 de Inline::Java sobre Linux.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados