通过Pom.xml执行npm install报错:JSON解析异常与.npmrc配置问题
解决exec-maven-plugin执行npm install时的.npmrc配置问题
咱们先理清楚你遇到的核心问题:那个JSON解析错误Unexpected token < in JSON at position 0,本质是npm请求私有包时拿到了HTML响应(比如Nexus的404页面或者未授权页面),说明它没正确读取到.npmrc里的私有仓库配置,跑去默认公共仓库找私有包,自然失败了。下面分两部分解决你的疑问:
一、如何在pom.xml中指定.npmrc的位置
你可以通过两种方式在exec-maven-plugin里强制指定.npmrc路径:
方法1:通过npm命令行参数指定
直接在插件的arguments里添加--userconfig参数,明确指向你的.npmrc文件路径。修改后的插件配置如下:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <id>npm install my</id> <goals> <goal>exec</goal> </goals> <phase>generate-sources</phase> <configuration> <executable>npm</executable> <workingDirectory>${project.basedir}/../</workingDirectory> <arguments> <argument>install</argument> <!-- 指定.npmrc的路径,这里换成你实际的文件位置 --> <argument>--userconfig</argument> <argument>${project.basedir}/../.npmrc</argument> </arguments> </configuration> </execution> </executions> </plugin>
方法2:通过环境变量指定
在插件配置里添加environmentVariables,设置NPM_CONFIG_USERCONFIG环境变量,npm会自动读取这个路径的配置文件:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <id>npm install my</id> <goals> <goal>exec</goal> </goals> <phase>generate-sources</phase> <configuration> <executable>npm</executable> <workingDirectory>${project.basedir}/../</workingDirectory> <environmentVariables> <!-- 指定.npmrc路径 --> <NPM_CONFIG_USERCONFIG>${project.basedir}/../.npmrc</NPM_CONFIG_USERCONFIG> </environmentVariables> <arguments> <argument>install</argument> </arguments> </configuration> </execution> </executions> </plugin>
二、为什么npm没有自动找到你的.npmrc?
npm查找.npmrc是有固定优先级顺序的,没找到大概率是以下某个原因:
- 工作目录不匹配:你的插件设置了
workingDirectory为${project.basedir}/../,npm会在这个目录及其父目录下找.npmrc。如果你把.npmrc放在了Java项目的根目录(${project.basedir}),那npm的工作目录是上一级,自然扫不到。 - 文件命名或位置错误:比如文件名写成了
npmrc(少了开头的点)、或者带了多余后缀(比如.npmrc.txt),或者文件路径层级不对,npm识别不到。 - 权限问题:运行mvn命令的用户没有读取该.npmrc文件的权限,导致npm无法加载它。
- 环境变量干扰:如果系统里已经设置了
NPM_CONFIG_USERCONFIG环境变量,指向了一个不存在或无效的文件,npm会优先用这个配置,忽略项目级的.npmrc。
额外排查建议
- 先手动在
${project.basedir}/../目录下执行npm install --userconfig 你的.npmrc路径,验证配置是否能正常拉取私有包。 - 执行
npm config list --l,查看npm实际加载的配置项,确认是否包含了你在.npmrc里设置的私有仓库地址。 - 检查.npmrc的内容是否正确,私有仓库的配置格式应该类似:
@test:registry=http://你的Nexus地址/repository/npm-private/ //你的Nexus地址/repository/npm-private/:_authToken=你的授权令牌
内容的提问来源于stack exchange,提问作者user1365697
相关产品推荐
相关产品推荐

