在 CentOS 7 服务器上,我有一个 Java 程序
/path/to/parent/bin/mainpackage/SendText.class
,当我使用以下语法从位于 /path/to/parent/bin
的 C 程序调用它时,它可以完美运行:
system("java -cp .:\"/path/to/parent/dependencies/*\" mainpackage.SendText username pincode");
但是问题是C程序无法定位到
/path/to/parent/bin
。 相反,C 程序必须位于 /path/to/parent/
中。如何更改语法以便 Java 程序在从 /path/to/parent/
调用时运行?
这是我到目前为止所做的设置:
Java程序是使用命令
从
/path/to/anotherparent/
编译而来的
javac -d bin -cp .:/path/to/anotherparent/dependencies/twilio-java-sdk-3.4.5.jar:/path/to/anotherparent/dependencies/httpcore-4.1.2.jar SendText.java
然后,我创建了目标并将 SendText.class 及其依赖项复制到目标,如下所示:
[user@domain somedir]$ mkdir /path/to/parent/bin/
[user@domain somedir]$ mkdir /path/to/parent/bin/mainpackage
[user@domain somedir]$ sudo cp /home/username/javacode/bin/mainpackage/SendText.class /path/to/parent/bin/mainpackage
[user@domain somedir]$ sudo mkdir /path/to/parent/dependencies
[user@domain somedir]$ sudo cp -R /home/username/javacode/dependencies/* /path/to/parent/dependencies
接下来,我在
atest.c
中创建了C程序/path/to/parent/
,如下:
[user@domain somedir]$ cd /path/to/parent
[user@domain parent]$ sudo nano atest.c
int main (void){
char jcmd[256] = "java -cp .:\"/path/to/parent/dependencies/*\" mainpackage.SendText username pincode";
printf(jcmd);
system(jcmd);
return 0;
}
Ctrl-X to save the program
我编译了C程序并尝试从
/path/to/parent/
运行它,如下所示:
[user@domain parent]$ sudo cc atest.c -o atest
[user@domain parent]$ ./atest
Error: Could not find or load main class mainpackage.SendText
java -cp .:"/path/to/parent/dependencies/*" mainpackage.SendText username pincode
为了确认问题出在 C 文件的位置,我执行了以下操作:
[user@domain parent]$ sudo cp atest bin
[user@domain parent]$ cd /path/to/parent/bin
[user@domain bin]$ ./atest
程序成功运行
/path/to/parent/bin
那么,当使用命令
/path/to/parent/
从 ./atest
调用 Java 程序时,我该如何更改才能成功运行呢?
javac -d bin ...
这意味着
bin
作为绝对路径,在运行时必须出现在 CLASSPATH 中。更好的是,为 bin
的内容创建一个 JAR 文件,随时随地放置它,并在执行时提供 JAR 文件的绝对路径作为 CLASSPATH 元素。