java - 如何使用 Inline::Java 连接到外部 JVM?

标签 java perl jvm perl-module

如何使用 Inline::Java 连接到外部、已运行的 JVM ?

我正在尝试连接到正在运行的 OSGi 应用程序,以便我可以发送和接收对象、数组、列表等。据我了解,Inline::Java创建自己的 JVM 来运行 Java 代码;我需要弄清楚的是如何在 JVM 和运行应用程序的 JVM 之间进行通信。

我尝试使用 RMI,并为客户端使用以下代码:

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import example.hello.Hello;

public class Client {

    private Client() {}

    public static void main(String[] args) {

        String host = (args.length < 1) ? null : args[0];
        try {
            Registry registry = LocateRegistry.getRegistry(host);
            Hello stub = (Hello) registry.lookup("Hello");
            String response = stub.sayHello();
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }

当我单独编译并运行它时,它可以工作,但是当我尝试使用 Inline::Java 将代码嵌入到 Perl 脚本中时,它会给出错误:

C:\Users\josesong\Documents\RMI_Test>perl hello.pl

A problem was encountered while attempting to compile and install your Inline
Java code. The command that failed was:
  "C:\Program Files\Java\jdk1.8.0_20\bin\javac.exe" -deprecation  -d "C:\Users\j
osesong\Documents\RMI_Test\lib\auto\hello_pl_5a5a" Client.java > cmd.out 2>&1

构建目录是:

C:\Users\josesong\Documents\RMI_Test\build\hello_pl_5a5a

错误消息是:

Client.java:3: error: package example.hello does not exist
import example.hello.Hello;
                    ^
Client.java:14: error: cannot find symbol
            Hello stub = (Hello) registry.lookup("Hello");
            ^
  symbol:   class Hello
  location: class Client
Client.java:14: error: cannot find symbol
            Hello stub = (Hello) registry.lookup("Hello");
                          ^
  symbol:   class Hello
  location: class Client
3 errors

为了调试问题,我cd到构建目录并检查输出文件,如下所示:

 at hello.pl line 2.
BEGIN failed--compilation aborted at hello.pl line 2.

这可能是什么原因造成的?

perl 脚本:

use Inline (Java => Config => DIRECTORY => 'C:\Users\josesong\Documents\RMI_Test');
use Inline Java => 'C:\Users\josesong\Documents\RMI_Test\Client.java';

最佳答案

通过定义类路径并使用 STUDY 配置解决了该问题,如下所示:

    use Inline (Java => Config => DIRECTORY => 'tmp');
    use Inline  Java => 'C:\Users\josesong\Documents\RMI_Test\Client.java',
    CLASSPATH => 'C:\Users\josesong\Documents\RMI_Test',
        STUDY => ['example.hello.Hello', 'example.hello.Server'];

    $obj = Client -> new();
    $obj -> main([]);

关于java - 如何使用 Inline::Java 连接到外部 JVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25728402/

相关文章:

java - 创建新资源时出现 400 错误的 Dropwizard 示例

java - Struts 2 使用 # 语法访问操作标签属性

java - 使用 SearchView 过滤 Recyclerview 后位置错误

java - 如何查看 JVM 内部(?)。我可以在工作应用程序中分析方法、参数、返回值等吗?

java - 在 Java 中,是否可以增加 JVM 的可用内存和/或杀死其他 Java 程序?

java - 使用 IF 的 do-while 循环

perl - Net::Google::AuthSub 登录失败,使用新的 Google Drive 版本

xml - 用于 (x)html 的 perl xml::libxml dom 解析器的一组有用的食谱示例?

perl 脚本仅在使用 -d 开关运行时才会引发编译错误

java - 保留堆的镜像并在执行某些方法后返回它