SpringBoot项目导出可执行jar包,启动时报错:factory already defined

本文介绍了一次使用SpringBoot框架开发的小型项目遇到的问题及解决方案。初始使用Eclipse打包成可执行JAR失败,通过调整为Maven方式打包并配置spring-boot-maven-plugin插件,成功解决了启动异常,实现了项目的正常运行。

近期用springboot框架做了个小型项目,用来处理用户回复的消息相关。阿里云服务器上没有tomcat,所以打算将项目打包成jar运行。使用eclipse中的 项目右键 -> export -> 可执行jar,这种方式下的jar无法正常运行,报错如下:

严重: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
	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: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:423)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:928)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Tomcat.start(Tomcat.java:455)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:106)
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86)
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:415)
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:154)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
	at com.chl.SpiderRun.main(SpiderRun.java:22)
	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.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: org.apache.catalina.LifecycleException: A child container failed during start
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:921)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367)
	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:902)
	... 26 more
Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.StandardRoot@7e28ed99]
	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:909)
	... 34 more
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.StandardRoot@7e28ed99]
	at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
	at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:139)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:173)
	at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4783)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4918)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367)
	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:902)
	... 34 more
Caused by: java.lang.Error: factory already defined
	at java.net.URL.setURLStreamHandlerFactory(URL.java:1112)
	at org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.<init>(TomcatURLStreamHandlerFactory.java:130)
	at org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.getInstanceInternal(TomcatURLStreamHandlerFactory.java:53)
	at org.apache.catalina.webresources.TomcatURLStreamHandlerFactory.register(TomcatURLStreamHandlerFactory.java:77)
	at org.apache.catalina.webresources.StandardRoot.registerURLStreamHandlerFactory(StandardRoot.java:699)
	at org.apache.catalina.webresources.StandardRoot.initInternal(StandardRoot.java:682)
	at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
	... 44 more

网上查了下,针对这个错误具体的原因没有找到,但很多内容指向打包方式,所以重新配置下,用maven方式打包

<!-- 打包类型 -->
<packaging>jar</packaging>

<!-- 打包处理 -->
<build>
	<finalName>Spider</finalName>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
			
			<!-- 排除一些指定文件 -->
			<configuration>
				<extensions>
					<extension>*.md</extension>
					<extension>AttactController.java</extension>
					<extension>**/webmagic/*</extension>
				</extensions>
			</configuration>
		</plugin>
	</plugins>
</build>

执行以下命令获得jar包

mvn clean package

执行jar运行

java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms256m -Xmx256m -Xmn128m -Xss256k -jar spider.jar

出现以下信息说明正常

chenhailongdeMacBook-Pro:Desktop chenhailong$ java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms256m -Xmx256m -Xmn128m -Xss256k -jar LawSpider-va.jar 
2019-09-19 14:41:51,865  INFO Version:21 - HV000001: Hibernate Validator 6.0.14.Final

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-09-19 14:41:52,247  INFO SpiderRun:50 - Starting SpiderRun on chenhailongdeMacBook-Pro.local with PID 2846 (/Users/chenhailong/Desktop/LawSpider-va.jar started by chenhailong in /Users/chenhailong/Desktop)
2019-09-19 14:41:52,249  INFO SpiderRun:675 - No active profile set, falling back to default profiles: default
2019-09-19 14:41:53,373  INFO RepositoryConfigurationDelegate:244 - Multiple Spring Data modules found, entering strict repository configuration mode!
2019-09-19 14:41:53,379  INFO RepositoryConfigurationDelegate:126 - Bootstrapping Spring Data repositories in DEFAULT mode.
2019-09-19 14:41:53,434  INFO RepositoryConfigurationDelegate:182 - Finished Spring Data repository scanning in 35ms. Found 0 repository interfaces.
2019-09-19 14:41:53,876  INFO PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$7ffca964] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-09-19 14:41:54,361  INFO TomcatWebServer:90 - Tomcat initialized with port(s): 8080 (http)
九月 19, 2019 2:41:54 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service [Tomcat]
九月 19, 2019 2:41:54 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet engine: [Apache Tomcat/9.0.16]
九月 19, 2019 2:41:54 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/chenhailong/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]
九月 19, 2019 2:41:54 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring embedded WebApplicationContext
2019-09-19 14:41:54,559  INFO ContextLoader:296 - Root WebApplicationContext: initialization completed in 2215 ms
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2019-09-19 14:41:55,948  INFO ThreadPoolTaskExecutor:171 - Initializing ExecutorService 'applicationTaskExecutor'
2019-09-19 14:41:56,807  INFO TomcatWebServer:204 - Tomcat started on port(s): 8080 (http) with context path ''
2019-09-19 14:41:56,810  INFO SpiderRun:59 - Started SpiderRun in 5.208 seconds (JVM running for 5.991)


<think>好的,用户现在遇到了在使用npm start时出现的错误“jirname is not defined”,需要解决这个问题。首先,我需要回忆一下之前的对话历史。用户之前询问过如何将Yarn替换为npm,我之前给出了详细的步骤,括删除Yarn相关文件、使用npm安装依赖、命令对照等。现在用户可能已经完成了迁移,但在运行npm start时遇到了问题。 接下来,我需要分析这个错误的原因。“jirname is not defined”看起来像是变量未定义的JavaScript错误。可能的情况是用户在代码中拼写错误,比如将“jarname”写成了“jirname”,或者某个依赖项中存在拼写错误。另外,可能是在环境变量或配置文件中引用了不存在的变量。 首先,我会考虑用户是否在迁移过程中修改了某些脚本或配置文件,导致变量名错误。例如,在package.json的scripts部分,可能错误地引用了变量。此外,用户可能在代码中使用process.env环境变量,但未正确设置,导致undefined。 还需要检查是否有第三方库或插件中存在拼写错误,或者版本不兼容的问题。例如,某个依赖可能在更新后改变了变量名,但用户的项目中仍在使用旧名称。此外,可能是在构建过程中,如Webpack或Babel配置中错误引用了变量。 接下来,我需要根据这些可能性,逐步给出排查步骤。首先建议用户检查代码中的拼写错误,特别是与“jirname”相关的部分。然后检查package.json中的scripts是否正确,是否有拼写错误。接着,检查环境变量的设置,是否在.env文件中正确声明。然后,检查依赖项是否正确安装,是否存在版本冲突。最后,建议用户查看构建工具配置和第三方库的文档,确认是否有变量名变更。 同时,需要参考之前的回答,确保用户已经正确迁移到npm,删除了所有Yarn相关的文件,并且依赖安装正确。如果用户在迁移过程中遗漏了某些步骤,比如没有正确删除yarn.lock或没有重新安装依赖,可能会导致依赖解析错误,从而引发运行时问题。因此,可能需要提醒用户再次确认这些步骤是否执行到位。 另外,用户可能不太清楚如何具体检查这些地方,因此需要给出具体的命令和代码示例,比如如何搜索项目中的“jirname”,如何检查package.json中的scripts,如何检查环境变量文件等。还要考虑到不同项目的结构可能不同,可能需要用户根据实际情况调整步骤。 最后,需要确保回答清晰、有条理,逐步引导用户排查问题,同时保持语言简洁易懂,避免技术术语过多,或者给出过于复杂的解决方案。可能还需要提示用户如果自行排查无果,提供更多上下文信息以便进一步帮助。</think>### 如何解决 `npm start` 报错 `jirname is not defined`? --- #### 1. **定位错误来源** - **检查代码上下文**: 在终端报错信息中确认具体报错文件及行号(如 `src/index.js:15`)。 示例错误: ``` ReferenceError: jirname is not defined at Object.<anonymous> (/project/src/index.js:15:3) ``` - **全局搜索关键词**: 在项目中搜索 `jirname`,确认是否属于代码拼写错误: ```bash grep -rnw . -e 'jirname' # 查找所有含"jirname"的文件 ``` --- #### 2. **常见原因与解决方案** ##### 可能性 1:**变量名拼写错误** - **代码检查**: 检查 `jirname` 是否应为 `jarname`、`dirname` 或其他相似名称(如 `__dirname`)[^1]。 常见场景:文件路径操作时误写 Node.js 内置变量 `__dirname`。 ```javascript // 错误示例 const path = require('path'); const root = jirname; // 应为 __dirname // 正确修复 const root = __dirname; ``` ##### 可能性 2:**环境变量未定义** - **检查 `.env` 文件**: 若 `jirname` 是环境变量,需在 `.env` 或启动命令中声明: ```bash # .env 文件 JIRNAME=your_value ``` - **启动命令注入变量**: 临时测试环境变量: ```bash JIRNAME=test_value npm start ``` ##### 可能性 3:**package.json 脚本配置错误** - **检查 `scripts` 字段**: 确认 `package.json` 的 `start` 脚本是否含未定义的变量: ```json { "scripts": { "start": "node app.js --name=jirname" // 错误:jirname 未赋值 } } ``` 修正方案(使用环境变量或固定值): ```json "start": "node app.js --name=$JIRNAME" // 从环境变量读取 或 "start": "node app.js --name=my_project" ``` ##### 可能性 4:**依赖未正确安装** - **重新安装依赖**: 若问题出现在迁移 Yarn 到 npm 后,可能依赖解析不一致: ```bash rm -rf node_modules package-lock.json npm install # 强制重建依赖树 ``` --- #### 3. **高级排查** - **调试模式运行**: 通过 `--inspect` 启动调试,在 Chrome DevTools 中定位问题: ```bash npm start -- --inspect ``` 访问 `chrome://inspect` 附加调试器,逐步执行代码。 - **检查第三方库兼容性**: 若 `jirname` 来自某个依赖库,检查其文档确认变量命名和版本要求: ```bash npm ls <dependency_name> # 查看依赖树版本 ``` --- ### 相关问题 1. 如何通过 `npm config` 设置默认环境变量? 2. Node.js 中 `__dirname` 和 `process.cwd()` 有何区别? 3. 如何调试 npm 脚本执行时的环境变量泄露问题? [^1]: Node.js 官方文档明确指出 `__dirname` 表示当前模块的目录名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值