CentOS 7下编译JSVC时JAVA_HOME路径配置冲突问题求助
CentOS 7下JSVC编译路径矛盾问题解决
问题背景
在CentOS 7上从commons-daemon-1.0.15-src.tar.gz源码包构建JSVC时,遇到以下矛盾:
- JDK安装路径为
/usr/java/jdk1.8.0_351-amd64,已正确设置$JAVA_HOME环境变量 - 执行
./configure时,即使指定--with-java=/usr/java/jdk1.8.0_351-amd64也无法通过检测,必须添加/include后缀才能完成configure,命令如下:sudo ./configure --with-java=/usr/java/jdk1.8.0_351-amd64/include --with-os-type=linux - 但执行
make时,gcc命令会出现重复路径/usr/java/jdk1.8.0_351-amd64/include/include,导致找不到jni.h文件,报错信息:sudo make -I /usr/java/jdk1.8.0_351-amd64(cd native; make all) make[1]: Entering directory `/opt/install/commons-daemon-1.0.15-src/src/native/unix/native' gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk1.8.0_351-amd64/include/include -I/usr/java/jdk1.8.0_351-amd64/include/include/linux -c java.c -o java.o java.c:24:17: fatal error: jni.h: No such file or directory
解决方案
方案1:修改configure脚本修复路径拼接逻辑
- 进入JSVC源码的unix目录:
cd /opt/install/commons-daemon-1.0.15-src/src/native/unix - 编辑configure脚本,搜索与
--with-java相关的路径处理代码,找到类似JAVA_INCLUDE="$with_java/include"的行,修改为:if echo "$with_java" | grep -q "/include$"; then JAVA_INCLUDE="$with_java" else JAVA_INCLUDE="$with_java/include" fi - 保存脚本后,直接使用JDK根路径执行configure:
sudo ./configure --with-java=/usr/java/jdk1.8.0_351-amd64 --with-os-type=linux - 正常执行
make完成编译。
方案2:通过软链接临时规避路径重复
- 创建临时目录并建立软链接,模拟一个不会触发重复拼接的路径结构:
mkdir -p /tmp/java-temp ln -s /usr/java/jdk1.8.0_351-amd64/include /tmp/java-temp/include - 使用临时路径执行configure:
sudo ./configure --with-java=/tmp/java-temp --with-os-type=linux - 执行
make完成编译后,删除临时目录:rm -rf /tmp/java-temp
方案3:手动修正Makefile中的错误路径
- 先执行能通过的configure命令:
sudo ./configure --with-java=/usr/java/jdk1.8.0_351-amd64/include --with-os-type=linux - 进入native目录编辑Makefile:
cd native vi Makefile - 找到所有包含
-I/usr/java/jdk1.8.0_351-amd64/include/include的行,将重复的/include删除,修正为:-I/usr/java/jdk1.8.0_351-amd64/include -I/usr/java/jdk1.8.0_351-amd64/include/linux - 保存后执行
make即可完成编译。
方案4:升级JSVC版本
commons-daemon 1.0.15版本的configure脚本存在路径识别bug,建议使用更新版本的源码包(如1.3.0及以上),新版本脚本可正确识别$JAVA_HOME或--with-java指定的JDK根路径,无需额外调整。
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

