如何让IntelliJ适配含共享静态资源模块的多模块Maven项目
问题说明
我手头有个多模块Maven项目,shared模块存着供public、admin等模块用的共享静态资源,现在需要让IntelliJ实现两个功能:
- 自动补全shared模块里的JavaScript类,并且自动添加导入代码
- 对静态资源的错误链接给出警告
目前在public模块的index.html里输入new Mon,IntelliJ能提示shared模块的Monkey类,补全成new Monkey()但不会自动加导入,还弹出“Cannot build a module path for importing”的提示。项目不管是在IntelliJ本地运行,还是打包成jar启动,都能正常读取shared的静态资源,但IntelliJ的代码提示和导入功能就是不正常。
项目结构:
modules ├── logic │ ├── db │ └── file-storage └── sites ├── admin ├── public ├── shared └── site-starter
public和admin模块都依赖shared模块,能生成单个jar包启动admin或public。
已尝试的操作
- 确认模块依赖配置没问题
- 在public模块的build节点里加了资源配置:
<resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>../shared/src/main/resources</directory> </resource> </resources>
- 清除IntelliJ缓存、删掉.iml文件后重启
- 通过
File->Project Structure->Modules给public模块加了内容根
解决步骤(优先Maven配置,再调IntelliJ设置)
一、Maven配置优化
1. 调整shared模块的资源打包规则
在shared模块的pom.xml里明确资源目录和包含的文件类型,让它打包时能把静态资源正确纳入:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.js</include> <include>**/*.css</include> <include>**/*.html</include> <!-- 按需添加其他静态资源类型 --> </includes> </resource> </resources> </build>
同时确保public/admin模块对shared的依赖是compile范围(默认就是这个,不用改除非手动调整过):
<dependency> <groupId>你的项目groupId</groupId> <artifactId>shared</artifactId> <version>项目版本号</version> </dependency>
2. 用Maven资源插件复制共享资源
在public/admin模块的pom.xml里添加maven-resources-plugin,把shared的静态资源复制到当前模块的编译目录,让IntelliJ能把这些资源识别成本地资源:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-shared-resources</id> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/classes/static</outputDirectory> <resources> <resource> <directory>${project.basedir}/../shared/src/main/resources</directory> <includes> <include>**/*.js</include> <include>**/*.css</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
二、IntelliJ设置调整
如果Maven配置后还是没解决,试试下面的操作:
1. 配置模块依赖的导出属性
打开File -> Project Structure -> Modules,选中public/admin模块,切换到Dependencies标签:
- 找到shared模块的依赖,点击右侧的
Edit按钮 - 在弹出的窗口里勾选
Export,确保shared的资源能被当前模块的索引识别
2. 把共享资源目录标记为JavaScript库
打开File -> Settings -> Languages & Frameworks -> JavaScript -> Libraries:
- 点击
+号,选择Attach Files or Directories - 选中shared模块下的
src/main/resources目录,把它标记成JavaScript库 - 勾选
Use this library in this project,并把它应用到public/admin模块
3. 重新构建项目索引
执行File -> Invalidate Caches...,选择Invalidate and Restart,让IntelliJ重新索引整个项目。
4. 标记静态资源根目录
为了让IntelliJ识别静态资源链接:
- 右键点击shared模块的
src/main/resources目录,选择Mark Directory as -> Resource Root - 如果用了上面的Maven插件复制资源,也把public/admin模块的
target/classes/static目录标记成Resource Root
内容的提问来源于stack exchange,提问作者Henrik Schinzel

