问题描述
我在.jar中具有这样的JAVA函数。
我想在R中调用此函数,但无法使用“ main”方法。有谁知道如何使用rJAVA调用此“主要”方法来产生结果?
我已经读过一个地方,我需要在JAVA代码中创建一个单独的静态方法来访问它,对吗?
public class CountJTrees
{
public static void main(String[] args)
{
try
{
Network<String,Object> g = Graphs.read();
try
{
JTree<String> jjt = new JTree<String>(g);
System.out.println(jjt.enumerate());
}
catch(GraphNotDecomposableException e)
{
System.out.println(0);
}
}
catch (Exception e)
{
System.err.println("Caught CountJTrees.main()");
e.printStackTrace();
}
}
}
解决方法
假设您的结构如下:
.
|-- Manifest.txt
`-- src
`-- somepackage
`-- StringTest.java
文件StringTest.java
包含:
package somepackage;
public class StringTest {
public String changeString(String str) {
return "I have changed the string: " + str;
}
public static void main(String [] arg) {
System.out.println(new StringTest().changeString("Hello"));
}
}
您可以轻松构建JAR
文件。带有Manifest.txt
文件
Manifest-Version: 1.0
Main-Class: somepackage.StringTest
以下方式:
> jar cfm test.jar Manifest.txt -C target somepackage/StringTest.class
# execute JAR - just to test it works as expected
> java -jar test.jar
I have changed the string: Hello
一旦JAR
正常工作,就可以在R
中运行它
> export CLASSPATH=./test.jar
> R
R version 3.6.1 (2019-07-05) -- "Action of the Toes"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)
...
...
...
> library(rJava)
> .jinit()
> obj <- .jnew("somepackage.StringTest")
> s <- .jcall(obj,returnSig="V",method="main",c("Hello","Hello") )
I have changed the string: Hello
>