springboot linux启动报java.lang.IllegalArgumentException

本文解决SpringBoot在Linux环境下因SLF4J与Logback配置冲突导致的启动失败问题,详细分析了错误原因并提供了解决方案,包括排除特定日志库和调整依赖关系。

springboot linux启动报java.lang.IllegalArgumentException

启动报错提示

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/webapps/ei-appinfo-admin/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
13-Aug-2019 16:38:59.363 SEVERE [main] org.apache.catalina.core.ContainerBase.startInternal A child container failed during start
        java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:344)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
                ... 21 more
        Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/data/webapps/ei-appinfo-admin/WEB-INF/lib/slf4j-log4j12-1.7.25.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory
                at org.springframework.util.Assert.instanceCheckFailed(Assert.java:655)
                at org.springframework.util.Assert.isInstanceOf(Assert.java:555)
                at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:286)
                at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:102)
                at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:220)
                at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:199)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
                at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
                at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:69)
                at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48)
                at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91)
                at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5132)

报错描述

本地开发环境idea启动项目正常,部署在linux服务器上面报上述jar包冲突,项目中用的是logback 日志,所以这里一定要排除slf4j-log4j12 包,不要排除logback-classic 包,通过idea maven项目管理可以看到jar包依赖关系

点击之后可看到:


我们在这里排除掉slf4j-log4j12的jar包

排除之后重新打包放在linux服务器上面的tomcat启动即可

<think>我们正在解决两个问题:1.IllegalArgumentException:portoutofrange2.根据引用[2],还有一个Portalreadyinuse的问题,但用户明确问的是portoutofrange根据用户描述,他遇到了两个异常:-一个InternalServerErrorException,其中嵌套了IllegalArgumentException:objectisnotaninstanceofdeclaringclass(引用[1])-另一个是端口已使用的异常(引用[2])但是用户现在明确提问:如何解决“java.lang.IllegalArgumentExceptionportoutofrange”的问题。我们需要集中解决端口超出范围的问题。端口超出范围的原因:在Java中,合法的端口号范围是0~65535(0~1023是系统保留端口,通常我们使用1024~65535)。当设置端口时,如果传入的端口号不在这个范围内,就会抛出“java.lang.IllegalArgumentException:portoutofrange”异常。解决方案:1.检查代码中设置端口的地方,确认传入的端口值是否在0~65535之间。2.如果端口号是从配置文件读取的,检查配置文件中配置的端口值。3.如果端口号是通过命令行参数传入的,检查命令行参数。步骤:-找到设置端口的代码位置(例如:newServerSocket(port);或类似创建Socket、ServerSocket的地方)-确保端口值在合法范围内。另外,引用[2]中提到了端口已被占用(Addressalreadyinuse)的问题,但那是另一个异常(BindException)。然而,用户可能同时遇到两个问题,或者混淆了两个错误。但当前问题只问端口超出范围。注意:端口超出范围与端口被占用是不同的问题。端口超出范围是端口号数值不在0~65535,而端口被占用是指端口号在合法范围内,但是已经被其他进程占用。但是,在用户提供的引用[2]中,他们通过修改jboss-service.xml中的端口号解决了问题。这是因为1098被占用了,他们换了一个端口。但是用户现在问的是端口超出范围,所以我们需要区分。如果用户是在配置文件中设置了超出范围的端口号,那么修改配置文件中的端口号为合法值即可。示例:假如我们在配置文件中设置了:server.port=7000070000大于65535,所以会抛出端口超出范围异常。修改为:server.port=8080因此,解决方案步骤:1.定位代码中设置端口的位置,或配置文件中的端口配置项。2.检查端口值是否在0~65535之间(推荐使用1024~65535)。3.修改为合法端口。示例代码:如果是在代码中直接设置端口:intport=70000;//错误,超出范围//改为intport=8080;//正确如果是读取配置文件://假设使用SpringBoot的application.properties//在application.properties中:server.port=70000->改为server.port=80804.重新启动应用。另外,注意:端口0是特殊端口,表示系统自动分配一个可用端口。如果不希望自动分配,就不要使用0。如果用户同时遇到端口被占用的问题(即引用[2]中的情况),那么需要选择一个没有被占用的端口。但首先必须确保端口号在合法范围内。因此,对于端口超出范围的问题,核心是检查端口值的合法性。相关问题:由于用户提到了引用[2]中的端口占用问题,我们也可以提一下如何解决端口占用,但用户当前问题不在此。不过,我们可以生成相关问题。§§相关问题§§1.如何解决Java中端口被占用(Addressalreadyinuse)的问题?2.如何查看当前系统中已被占用的端口?3.Java中如何动态获取一个可用的端口?4.如何避免在硬编码端口号?5.SpringBoot中如何配置多个端口的服务?</think> ### 解决 `java.lang.IllegalArgumentException: port out of range` 的方法 当 Java 程序抛出 `java.lang.IllegalArgumentException: port out of range` 异常时,表明**端口号不在合法范围(0-65535)内**。以下是具体解决步骤: --- #### 1. **验证端口值范围** - Java 的合法端口范围是 `0` 到 `65535`(`0-1023` 通常为系统保留端口)。 - **检查代码中设置的端口值**,确保其在有效范围内: ```java int port = 8080; // 正确示例 (0 < port <= 65535) // int port = 70000; // 错误示例:超出范围 ``` --- #### 2. **动态处理配置端口** 若端口通过配置文件或外部参数传入,需添加**范围校验逻辑**: ```java int port = Integer.parseInt(config.getProperty("server.port")); if (port < 0 || port > 65535) { throw new IllegalArgumentException("端口必须在 0-65535 范围内"); } ServerSocket serverSocket = new ServerSocket(port); // 安全创建 ``` --- #### 3. **检查依赖服务配置** - 若使用应用服务器(如 Tomcat、JBoss),**检查配置文件中的端口定义**: - **Tomcat**: `conf/server.xml` 中的 `<Connector port="...">` - **JBoss**: `standalone.xml` 或 `domain.xml` 中的 `<socket-binding>` - 修改超范围端口(参考引用 [2] 的修改思路)[^2]。 --- #### 4. **捕获并处理异常** 在创建 `ServerSocket` 或 `Socket` 时显式捕获异常: ```java try { ServerSocket server = new ServerSocket(port); } catch (IllegalArgumentException e) { System.err.println("端口值无效: " + port); // 自动切换到备用端口 port = 8080; // 默认值 server = new ServerSocket(port); } ``` --- #### 5. **排查保留端口冲突** - 避免使用 **`0-1023`** 的保留端口(需管理员权限)。 - 在 Linux/Unix 系统下,可通过命令检查端口占用: ```bash netstat -tuln | grep <端口号> ``` --- #### 根本原因总结 此异常通常由两种操作触发: 1. 显式声明超范围端口(如 `-1` 或 `70000`)。 2. 未校验外部传入的端口参数(配置文件/用户输入)。 --- #### **相关问题** 1. 如何在 Java 中动态获取可用端口? 2. Tomcat/JBoss 如何修改默认端口以避免冲突? 3. 端口占用(`Address already in use`)与端口超范围有何区别? 4. 如何通过命令行参数传递并验证端口值? [^2]: 引用参考:通过修改配置文件(如 `jboss-service.xml`)替换冲突端口的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn565973850

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值