IntelliJ IDEA类过滤器模式语法疑问:com.myname.*Tests为何匹配不到目标类
IntelliJ IDEA 类过滤器模式匹配规则说明
匹配失败的核心原因
你写的com.myname.*Tests无法匹配com.myname.mypackage.Tests,是因为IntelliJ类过滤器的通配符遵循Ant风格路径匹配规则,单个*不能跨过包分隔符.:
- 单个
*仅能匹配单个包段/类名内的任意字符,不能包含. - 只有
**可以匹配零个或多个连续的包层级,支持跨过.分隔符com.myname.*Tests中的*只能匹配com.myname.之后、下一个.之前的字符,只能命中com.myname.UserTests这类直接放在myname包下、类名以Tests结尾的类,无法匹配中间还有mypackage包层级的目标类。
完整语法规则
- 精确匹配:直接写类的全限定名,仅匹配对应单个类,例:
com.myname.mypackage.Tests - 单字符通配
?:匹配单个任意字符,不能跨. - 单层级通配
*:匹配零个或多个非.字符,仅作用于单个包段或类名范围 - 跨层级通配
**:匹配零个或多个连续的包段,支持跨.使用
你尝试的其他模式匹配失败原因
com.myname.**.Tests:部分IDE版本对**后直接接.的语法支持有兼容问题,调整写法即可解决com.myname.*.Tests:仅能匹配myname包下一级子包中的Tests类,比如com.myname.service.Tests,多层子包或Tests类直接在myname包下时都会匹配失败com.myname..*.Tests、com.myname.**.*.Tests:写法不符合语法规则,多余的.和通配符会导致匹配逻辑异常
正确写法
如果需要匹配com.myname包下任意层级子包中,类名以Tests结尾的所有类,使用以下写法即可:com.myname.**Tests
如果仅需要匹配类名恰好为Tests的类,也可以用更精准的写法:com.myname.**.Tests
如果不需要限制包前缀,你之前测试有效的*Tests也可以直接使用。
内容的提问来源于stack exchange,提问作者Marco Eckstein
相关产品推荐
相关产品推荐

