资讯详情

资讯详情

Eclipse中创建Maven工程:从环境配置到项目运行的完整指南

1. 为什么在IDE里手动搭Maven工程比命令行更值得花时间很多人第一次接触Maven习惯直接在终端敲mvn archetype:generate一路回车把骨架拉起来然后才用IDE打开。这个流程本身没毛病但如果你后续要长期维护这个工程我建议你反过来——先在IDE里把工程建好再让它自动生成pom.xml。原因不复杂IDE帮你把目录结构、JDK绑定、编译输出路径、依赖索引这几件事一次性对齐了而命令行生成的骨架往往带着过时的模板版本导入IDE之后还得手动改一堆配置。Eclipse里创建Maven工程这件事看起来是个入门操作实际上藏着不少细节。比如src/main/java和src/main/resources的分离、pom.xml里packaging的取值、JRE版本和maven-compiler-plugin的匹配、以及工程导入后那个让人抓狂的红色感叹号。这些问题在教程里通常被一笔带过但真正卡住新手的恰恰是它们。这篇文章面向的是刚上手Maven、或者用过但一直没搞明白工程结构的人。我会从环境准备讲到工程跑通把每一步背后的逻辑说清楚再把我自己踩过的坑摊开给你看。读完你至少能做到两件事独立建出一个结构规范的Maven工程以及在工程报错时知道该往哪个方向排查。需要提前说明的是Eclipse的Maven集成在不同版本里菜单名称略有差异我下面描述的操作路径以较新的版本为准如果你用的是老版本菜单项可能藏在稍微不同的位置但逻辑是一致的。2. 动手之前先把这三样东西确认清楚2.1 JDK与Maven的版本对应关系Maven本身是Java写的它运行需要JDK它编译你的代码也需要JDK。这里有个常见的混淆点Maven运行用的JDK和你工程编译用的JDK可以是同一个也可以分开配置。新手最容易犯的错是机器上装了JDK 17但Maven的settings.xml或者环境变量指向了一个老版本的JDK结果建出来的工程编译级别莫名其妙变成了1.5。先确认你的JDK装好了命令行执行java -version javac -version两个命令输出的版本号应该一致。如果不一致说明你的JAVA_HOME和PATH指向了不同的JDK这个必须先修好否则后面Eclipse里配Maven还会出问题。然后是Maven本身。如果你还没装去官网下二进制包解压把bin目录加到PATH里然后验证mvn -version这个命令会输出Maven版本、Maven home路径、Java版本、操作系统信息。重点看Java version那一行它告诉你Maven实际用的是哪个JDK。我见过有人java -version显示17但mvn -version显示1.8原因是JAVA_HOME没设对。这种情况下你建Maven工程编译插件默认会用1.8的语法级别写lambda或者var就会报错。2.2 Eclipse的Maven插件是否就位较新版本的Eclipse比如2020年之后的版本通常已经内置了m2e插件也就是Maven Integration for Eclipse。你可以通过Help - About Eclipse IDE查看或者在Window - Preferences里看有没有Maven这一项。如果没有需要从Eclipse Marketplace装一个。这里有个细节m2e插件自带一个内嵌的Maven运行时但我不建议用它。内嵌版本往往比你自己装的Maven旧而且行为可能不一致。正确做法是在Eclipse里指向你本机安装的Maven具体在Window - Preferences - Maven - Installations里添加你的Maven目录。这样做的好处是命令行和IDE用的是同一套Maven不会出现命令行能跑、IDE报错的诡异情况。2.3 本地仓库的位置要不要改Maven默认把依赖下载到用户目录下的.m2/repository。如果你的系统盘空间紧张或者公司有统一的依赖仓库就需要改。改的位置在Maven安装目录的conf/settings.xml或者用户目录的.m2/settings.xml里找到localRepository标签填上你想要的路径。我个人的习惯是保留默认位置因为很多工具默认去那里找改了之后反而要到处配。但如果你C盘真的快满了改之前记得把已有的repository目录整个搬过去别只改配置不搬文件否则之前下过的依赖全部要重新下。提示settings.xml有两个位置安装目录下的叫全局配置用户目录下的叫用户配置。用户配置优先级更高改的时候别改错文件。3. 从新建向导到工程落地每一步到底在做什么3.1 选对工程类型Maven Project还是Maven Module打开File - New - Project在搜索框里输入Maven你会看到两个选项Maven Project和Maven Module。这两个的区别值得说清楚。Maven Project是独立工程有自己的pom.xml可以单独构建。Maven Module是子模块它必须依附于一个父工程存在本身不能独立构建除非父工程也一起构建。如果你只是要建一个普通的Java应用或者Web应用选Maven Project。如果你在做多模块项目先建父工程用Maven Project再在父工程上右键新建Maven Module。新手最常见的误操作是想建一个普通工程结果点了Maven Module然后发现向导要求指定父工程卡在那里不知道填什么。记住单工程就选Maven Project。3.2 勾选Create a simple project意味着什么向导第一步会让你选工程存放位置第二步会有一个复选框叫Create a simple project (skip archetype selection)。这个选项的含义是跳过原型archetype选择直接生成一个最简的pom.xml。勾选它的好处是快不用等Eclipse去远程拉原型目录那个过程有时候慢得让人怀疑人生。坏处是生成的工程只有pom.xml没有src/main/java这些目录需要你手动建。不勾选的话Eclipse会列出各种archetype让你选比如maven-archetype-quickstart会帮你生成一个带App.java和测试类的完整骨架。但问题是这些archetype的版本可能很旧生成的pom.xml里JUnit版本还是3.x编译插件版本也很老你导入后还得手动升级。我的建议是勾选simple project自己建目录。这样你对工程结构的掌控力最强也不会被过时的模板带偏。下面我就按这个路径走。3.3 Group Id、Artifact Id、Version这三个坐标怎么填向导里最让人犹豫的就是这三个字段。它们合起来构成Maven的坐标GAV用来唯一标识一个构件。Group Id通常用反向域名比如com.example。它代表组织或项目组。如果你只是自己练手随便填个com.demo也行但别用默认的com.example之外还带特殊字符。Artifact Id工程名比如my-first-maven。它会成为你打包出来的jar包名的一部分。Version版本号默认0.0.1-SNAPSHOT。SNAPSHOT表示快照版本开发阶段用这个后缀是惯例正式发布时去掉。这三个字段填完之后pom.xml里就会生成对应的groupId、artifactId、version标签。后面你如果要引用这个工程作为依赖用的就是这三个值。Packaging那一栏普通Java应用选jarWeb应用选war。选错了后面改pom.xml里的packaging标签也行但一开始选对省事。3.4 工程建好后目录是空的手动补齐标准结构勾了simple project之后工程建出来只有pom.xml和.settings之类的元数据目录。你需要手动建这几个目录src/main/java src/main/resources src/test/java src/test/resources建目录的时候有个坑Eclipse里右键新建文件夹如果直接输入src/main/java它会当成一个名字叫src.main.java的文件夹而不是三层嵌套。正确做法是一层一层建或者用src/main/java这种带斜杠的路径部分版本支持。建完之后右键工程Refresh一下Eclipse会自动识别这些目录的用途。src/main/java会被标记为源码目录图标上有个小包src/main/resources会被标记为资源目录。如果没识别出来右键工程Maven - Update Project强制刷新一次。注意src/main/java和src/test/java的编译输出路径是不同的前者进target/classes后者进target/test-classes。这是Maven的约定别去改。4. pom.xml里那些不写会出事的配置4.1 编译插件与源码级别的绑定新建的pom.xml默认可能没有配置maven-compiler-plugin这时候Maven会用默认的源码级别而这个默认值取决于你的Maven版本和JDK版本可能是1.5、1.6或者1.7。如果你代码里用了新语法编译就会报错。解决办法是在pom.xml的build里显式配置编译插件build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.11.0/version configuration source17/source target17/target encodingUTF-8/encoding /configuration /plugin /plugins /buildsource和target填你的JDK版本。encoding一定要设成UTF-8否则中文注释和字符串会乱码。这个坑我踩过不止一次尤其是工程里有中文资源文件的时候。4.2 依赖的scope到底怎么选在dependencies里加依赖时scope标签决定了这个依赖在哪些阶段可见。常见取值scope编译期测试期运行期打包进产物典型用途compile是是是是默认值核心依赖provided是是否否Servlet API等容器提供的runtime否是是是JDBC驱动test否是否否JUnit、Mockito新手最容易搞错的是JUnit的scope。如果你把JUnit写成默认的compile它会被打进最终的jar包里虽然不影响运行但产物会变大而且不规范。正确写法是加scopetest/scope。4.3 仓库配置什么时候需要加mirror如果你的网络环境访问Maven中央仓库比较慢可以在settings.xml里配镜像。配置的位置在mirrors标签下mirror idmirror-id/id mirrorOfcentral/mirrorOf urlhttps://your-mirror-url/url /mirrormirrorOf填central表示拦截所有对中央仓库的请求。如果你只想拦截特定仓库可以填仓库id。配好之后Eclipse里Maven - Update Project会走镜像下载速度会快很多。需要提醒的是镜像地址要填可用的填错了会导致所有依赖都下不下来报错信息还不一定直观。改完配置记得在Eclipse里Maven - Update Settings让配置生效。5. 工程建完跑不起来这几个报错我替你踩过了5.1 红色感叹号JRE版本不匹配工程建好后项目名上出现红色感叹号Problems视图里提示 The project cannot be built until build path errors are resolved 或者 Unbound classpath container: JRE System Library。这个问题的根因是pom.xml里配的编译级别和Eclipse工程绑定的JRE不一致。比如pom.xml里写的是Java 17但Eclipse工程用的是默认的JRE可能是1.8。解决步骤右键工程Properties - Java Build Path - Libraries看JRE System Library那一项是不是显示[JRE System Library]后面没有具体版本或者版本不对。双击它选择Workspace default JRE或者指定一个已安装的JDK。如果还是不行去Java Compiler那一页确认Compiler compliance level和pom.xml里的source一致。最后Maven - Update Project勾选Force Update of Snapshots/Releases。这个问题的本质是Eclipse的工程配置和Maven的配置是两套东西m2e插件负责同步它们但有时候同步不彻底需要手动干预。5.2 依赖下载不下来先看是不是网络问题pom.xml里加了依赖但代码里import报错Maven Dependencies里也找不到对应的jar。这种情况先别急着改配置按这个顺序排查看Eclipse底部的Maven Console有没有下载失败的日志。如果有Could not transfer artifact之类的信息说明是网络问题。检查settings.xml里的镜像配置是否正确有没有拼写错误。去本地仓库目录看对应的文件夹如果里面有.lastUpdated后缀的文件说明之前下载失败过Maven会缓存失败状态。删掉这些.lastUpdated文件再Update Project。如果本地仓库里jar包存在但Eclipse不认右键工程Maven - Update Project勾选Force Update。.lastUpdated文件这个坑特别隐蔽很多人不知道它的存在明明网络已经恢复了Maven还是不去重新下载就是因为这个缓存文件在作祟。5.3 编译报源发行版X需要目标发行版X这个报错的完整信息通常是 Source option 5 is no longer supported 或者 invalid target release。根因是编译插件用的JDK版本和你指定的source/target不匹配。比如你pom.xml里写了source17/source但Maven实际运行的JDK是1.8它不认识17这个值就会报错。回到第2.1节用mvn -version确认Maven用的JDK版本确保它大于等于你source里写的版本。如果Maven用的JDK没问题但Eclipse里还是报错那就是Eclipse的工程配置没同步。去Properties - Java Build Path确认JRE再去Java Compiler确认compliance level两边都对齐。6. 让工程真正跑起来编译、打包、运行一条龙6.1 用Maven命令验证工程是否健康工程配置好之后别急着在Eclipse里点运行先用Maven命令验证一遍。在工程根目录有pom.xml的那一层打开终端执行mvn clean compile这个命令会清理target目录然后编译src/main/java下的所有源码。如果编译成功说明依赖、编译插件、源码级别都没问题。接着执行mvn clean package它会编译、跑测试、打包。如果测试失败打包会中断。如果你想跳过测试mvn clean package -DskipTests注意-DskipTests是跳过测试执行但测试代码还是会编译。如果测试代码本身编译不过用-Dmaven.test.skiptrue它连测试代码都不编译。6.2 在Eclipse里配置运行配置命令行验证通过后在Eclipse里运行就简单了。右键主类Run As - Java Application。但这里有个细节Eclipse运行用的是工程构建路径里的classpath而不是Maven的依赖树。如果两者不一致可能出现命令行能跑、Eclipse报ClassNotFound的情况。保证一致的方法是每次改完pom.xml都执行一次Maven - Update Project。这个操作会让m2e重新计算依赖并同步到Eclipse的构建路径。如果你要跑的是Web应用需要配置Tomcat之类的服务器那是另一个话题了。核心逻辑是一样的确保Eclipse的构建路径和Maven的依赖一致。6.3 打包产物在哪里怎么验证mvn package成功后产物在target目录下。jar包的名字格式是artifactId-version.jar比如my-first-maven-0.0.1-SNAPSHOT.jar。验证jar包能不能跑java -jar target/my-first-maven-0.0.1-SNAPSHOT.jar如果报 no main manifest attribute说明pom.xml里没配maven-jar-plugin的mainClass。需要在build里加plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-jar-plugin/artifactId version3.3.0/version configuration archive manifest mainClasscom.demo.App/mainClass /manifest /archive /configuration /plugin配好之后重新mvn package再跑就能看到输出。7. 几个让工程更规范的习惯7.1 把工程编码统一设成UTF-8Eclipse默认的工程编码可能是GBK取决于系统区域设置而Maven默认用平台编码。两边不一致时中文就会乱码。统一的做法是在pom.xml里加properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding /properties同时在Eclipse里右键工程Properties - Resource把Text file encoding也设成UTF-8。两边都设才能保证从源码到编译到运行全程不乱码。7.2 用dependencyManagement管理版本当工程变大、依赖变多时同一个依赖可能在多个地方被引用版本号写得到处都是升级时容易漏改。用dependencyManagement可以集中管理版本dependencyManagement dependencies dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.10.0/version scopetest/scope /dependency /dependencies /dependencyManagement这样在dependencies里引用时就不用写版本号了统一由dependencyManagement决定。多模块工程里这个用法尤其重要父工程管版本子工程只管引用。7.3 定期执行dependency:tree排查冲突依赖冲突是Maven工程里最隐蔽的问题之一。两个不同的库引用了同一个库的不同版本Maven按最近优先原则选一个可能选中的版本缺了你需要的方法运行时才报NoSuchMethodError。排查命令mvn dependency:tree它会打印完整的依赖树。如果你怀疑某个依赖有问题可以加-DincludesgroupId:artifactId过滤mvn dependency:tree -Dincludescom.fasterxml.jackson.core:jackson-databind看到同一个构件出现多个版本时就要考虑用exclusions排除掉不需要的那个或者在dependencyManagement里锁定版本。8. 我个人的一点使用体会Eclipse的Maven集成这些年一直在改进但它的本质还是两套配置的同步器——Maven的pom.xml是一套Eclipse的工程配置是另一套m2e负责在两者之间搭桥。理解了这一点很多诡异问题就说得通了为什么改了pom.xml要Update Project为什么有时候Update了还是不对为什么命令行能跑IDE不行。我的习惯是任何对pom.xml的修改改完立刻Maven - Update Project不要攒着。另外工程建好之后先跑一遍mvn clean package确认命令行没问题再回IDE里操作。这样出问题时能快速定位是Maven的问题还是Eclipse的问题。最后分享一个小技巧如果你经常需要建结构相同的Maven工程可以把配好的工程另存为模板或者干脆写一个自己的archetype。虽然前期花点时间但后面建工程就是几秒钟的事比每次手动配省心得多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →