Java-No.08 Java Linux下获取服务器ip地址

本文提供了在Windows和Linux环境下获取本机IP地址的方法。对于Windows系统,可以通过InetAddress.getLocalHost()直接获取。而对于Linux系统,则提供了一段Java代码,通过遍历所有网络接口并检查非回环地址来获取真实的IP地址。

1、在window下获取本机ip地址

InetAddress inet = InetAddress.getLocalHost();  
System.out.println("本机的ip=" + inet.getHostAddress());

该方法在linux下获取到的ip为127.0.0.1,原因是你linux服务器上hosts配置了 127.0.0.1 localhost

可以修改hosts下将127.0.0.1改成你的本机真实ip地址

2、linux下代码获取本机ip地址

public static String getLocalHostIP() {
        try {
            for (Enumeration<NetworkInterface> nis = NetworkInterface
                    .getNetworkInterfaces(); nis.hasMoreElements();) {
                NetworkInterface ni = nis.nextElement();
                if (ni.isLoopback() || !ni.isUp())
                    continue;
                for (Enumeration<InetAddress> ias = ni.getInetAddresses(); ias.hasMoreElements();) {
                    InetAddress ia = ias.nextElement();
                    if (ia instanceof Inet6Address) continue;
                    return ia.getHostAddress();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }


转载于:https://my.oschina.net/shma1664/blog/393673

项目在本地用IDEA能正常运行,打包到内网服务器且用docker compose启动报:2025-11-12 09:14:37.021 ERROR 7 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initServer': Invocation of init method failed; nested exception is java.lang.UnsatisfiedLinkError: no jniavdevice in java.library.path at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:929) ~[spring-context-5.3.31.jar!/:5.3.31] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591) ~[spring-context-5.3.31.jar!/:5.3.31] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) [spring-boot-2.7.18.jar!/:2.7.18] at com.hohht.video.HohhotVideoBackendApplication.main(HohhotVideoBackendApplication.java:16) [classes!/:0.0.1-SNAPSHOT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_412] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_412] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_412] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_412] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) [Hohhot-video-backend-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) [Hohhot-video-backend-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) [Hohhot-video-backend-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) [Hohhot-video-backend-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] Caused by: java.lang.UnsatisfiedLinkError: no jniavdevice in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) ~[na:1.8.0_412] at java.lang.Runtime.loadLibrary0(Runtime.java:843) ~[na:1.8.0_412] at java.lang.System.loadLibrary(System.java:1136) ~[na:1.8.0_412] at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1738) ~[javacpp-1.5.6.jar!/:1.5.6] at org.bytedeco.javacpp.Loader.load(Loader.java:1345) ~[javacpp-1.5.6.jar!/:1.5.6] at org.bytedeco.javacpp.Loader.load(Loader.java:1157) ~[javacpp-1.5.6.jar!/:1.5.6] at org.bytedeco.javacpp.Loader.load(Loader.java:1133) ~[javacpp-1.5.6.jar!/:1.5.6] at org.bytedeco.ffmpeg.global.avdevice.<clinit>(avdevice.java:28) ~[ffmpeg-4.4-1.5.6.jar!/:4.4-1.5.6] at java.lang.Class.forName0(Native Method) ~[na:1.8.0_412] at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_412] at org.bytedeco.javacpp.Loader.load(Loader.java:1212) ~[javacpp-1.5.6.jar!/:1.5.6] at org.bytedeco.javacpp.Loader.load(Loader.java:1157) ~[javacpp-1.5.6.jar!/:1.5.6] at org.bytedeco.javacpp.Loader.load(Loader.java:1149) ~[javacpp-1.5.6.jar!/:1.5.6] at com.hohht.video.a24.init.InitServer.loadFFmpeg(InitServer.java:58) ~[classes!/:0.0.1-SNAPSHOT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_412] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_412] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_412] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_412] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.3.31.jar!/:5.3.31] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.3.31.jar!/:5.3.31] ... 26 common frames omitted Caused by: java.lang.UnsatisfiedLinkError: /root/.javacpp/cache/ffmpeg-4.4-1.5.6-linux-x86_64.jar/org/bytedeco/ffmpeg/linux-x86_64/libjniavdevice.so: libxcb.so.1: cannot open shared object file: No such file or directory at java.lang.ClassLoader$NativeLibrary.load(Native Method) ~[na:1.8.0_412] at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934) ~[na:1.8.0_412] at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817) ~[na:1.8.0_412] at java.lang.Runtime.load0(Runtime.java:782) ~[na:1.8.0_412] at java.lang.System.load(System.java:1100) ~[na:1.8.0_412] at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1685) ~[javacpp-1.5.6.jar!/:1.5.6] ... 43 common frames omitted
最新发布
11-13
<think> 嗯,用户遇到了一个典型的Spring Boot项目在本地开发环境运行正常,但在Docker生产环境部署失败的问题。从错误信息来看,核心矛盾集中在两方面:Spring容器初始化失败(BeanCreationException)和本地库加载失败(UnsatisfiedLinkError),后者还牵扯到libxcb.so.1这个系统级依赖缺失。 用户提到的三个关键错误其实有内在关联。首先排除干扰项——引用[1]提到的JavaMailSender配置问题应该不是主因,因为用户明确说本地运行正常。重点要关注的是: 1. jniavdevice找不到的问题,这属于JNI本地库调用失败 2. libxcb.so.1缺失则是更深层的系统依赖问题 3. BeanCreationException可能是前两个问题导致的连锁反应 考虑到用户使用docker-compose部署,需要特别注意容器环境与本地环境的差异。引用[4]提到的LD_LIBRARY_PATH配置思路很关键,但用户的情况更复杂些,因为还涉及操作系统级别的图形库依赖(libxcb)。这提示我用户项目可能用到了需要图形渲染的库,比如某些视频处理组件。 解决方案要分三层处理: 系统层:需要在Docker镜像中补充libxcb库,Alpine系和Debian系的安装命令不同 环境层:必须正确设置LD_LIBRARY_PATH包含.so文件目录,这点引用[4]说得很对 应用层:可能需要调整Spring Boot的本地库加载方式,特别是如果用了jna等组件 用户提到是内网服务器,这点很重要。意味着所有依赖都必须预置在镜像里,不能在线安装。所以Dockerfile里要完整包含: - 基础镜像选择(建议用带glibc的镜像) - libxcb等系统库安装 - 业务所需的.so文件拷贝 - 环境变量固化 突然想到个隐患点:用户本地可能是x86架构,而服务器可能是ARM架构。如果.so文件是平台相关的,这点必须确认。不过用户没提架构问题,先按同架构处理。 最后关于BeanCreationException,等前面两个问题解决后,如果还出现再具体分析。从经验看,很可能是某些Bean初始化时尝试加载本地库导致的级联失败。 准备在回复时给出完整的Dockerfile范例,特别是区分Alpine和Debian两套方案。还要提醒用户注意.so文件的目录权限问题,容器里常因权限导致找不到文件。 </think>根据错误分析,这是典型的**本地环境与容器环境差异**导致的依赖缺失问题。主要需解决三方面:Spring Bean创建异常、JNI本地库缺失、系统级图形库缺失。以下是完整解决方案: --- ### 一、问题根本原因 1. **`UnsatisfiedLinkError: no jniavdevice`** - Java无法在`java.library.path`中找到`jniavdevice.so`(可能是视频/图像处理库) 2. **`libxcb.so.1`缺失** - `jniavdevice.so`依赖Linux的X Window图形库`libxcb`,但基础Docker镜像未包含 3. **`BeanCreationException`** - 前两个错误导致Spring Bean初始化失败(如JavaMailSender等组件) --- ### 二、解决方案(Dockerfile优化) #### 步骤1:补充系统级依赖(关键) 在Dockerfile中安装图形库依赖,**根据基础镜像选择对应命令**: ```dockerfile # 若基础镜像为Debian/Ubuntu RUN apt-get update && apt-get install -y libxcb1 libx11-xcb1 libgl1-mesa-glx # 若基础镜像为Alpine RUN apk add --no-cache libxcb libx11 libgl ``` #### 步骤2:确保本地库文件(.so)被正确加载 ```dockerfile # 将本地库文件复制到镜像中(假设.so文件在项目目录的libs/下) COPY libs/*.so /usr/local/lib/ # 设置动态链接库路径(包含自定义目录和系统目录) ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ``` #### 步骤3:验证依赖树(可选但推荐) 在Dockerfile中添加调试命令: ```dockerfile # 安装ldd工具(Alpine用apk add ldd,Debian用apt install libc-bin) RUN ldd /usr/local/lib/jniavdevice.so # 检查.so文件的依赖是否满足 ``` --- ### 三、docker-compose.yml配置示例 ```yaml services: your-app: build: . environment: # 显式声明库路径(防止容器环境变量覆盖) LD_LIBRARY_PATH: "/usr/local/lib:${LD_LIBRARY_PATH}" volumes: # 如果.so文件需挂载(推荐直接打包进镜像) - ./libs:/usr/local/lib ``` --- ### 四、其他关键检查项 1. **文件权限问题** 确保.so文件在容器内有读取权限: ```dockerfile RUN chmod +r /usr/local/lib/*.so ``` 2. **架构一致性** 确认本地编译的`.so`文件与服务器架构相同(e.g., x86_64/ARM) 3. **Spring配置检查** 验证`application.properties`中无本地绝对路径配置(如邮件服务器地址需用域名非IP--- ### 五、故障排查命令 在容器内执行诊断: ```bash docker exec -it your-container sh # 1. 检查库是否存在 find / -name libxcb.so.1 # 2. 检查环境变量 echo $LD_LIBRARY_PATH # 3. 手动加载库(验证依赖) ldd /usr/local/lib/jniavdevice.so ``` > **重要提示**:若引用了第三方库(如SAP JCo),需确保其所有依赖项也一并打包。引用[2][4]中提到的问题本质相同——容器环境未正确配置动态链接路径[^2][^4]。 --- ### 六、完整Dockerfile示例(Debian基础) ```dockerfile FROM openjdk:11-jre-slim # 1. 安装系统依赖 RUN apt-get update && apt-get install -y libxcb1 libx11-xcb1 libgl1-mesa-glx # 2. 拷贝应用及库文件 COPY target/your-app.jar /app.jar COPY libs/*.so /usr/local/lib/ # 3. 设置环境变量 ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # 4. 启动命令 CMD ["java", "-jar", "/app.jar"] ``` 通过上述步骤,可同时解决**系统库缺失**、**JNI路径错误**及由此引发的**Spring Bean初始化失败**问题。 --- ### 相关问题 1. 如何避免Docker镜像中Linux依赖缺失导致的应用报错? 2. Spring Boot项目在容器环境中加载JNI库的最佳实践是什么? 3. Docker构建时如何减少因架构差异导致的本地库(.so)兼容性问题? 4. 容器内诊断动态链接库依赖的工具和方法有哪些? [^1]: 本地与容器环境差异导致的依赖缺失 [^2]: 动态链接库路径配置错误 [^4]: 容器环境变量未包含自定义库路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值