ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MyEclipse部署JavaWeb从环境到war包:版本搭配、Tomcat与MySQL联调及exe打包扩展

MyEclipse部署JavaWeb从环境到war包:版本搭配、Tomcat与MySQL联调及exe打包扩展 从“这个名字最响”说起拿到一个JavaWeb项目别急着写代码第一件该干的事是把项目在你自己的机器上跑起来。Myeclipse这个老牌IDE的部署环节很多人第一次接触时都卡在“明明代码没问题怎么就是404”这个坎上其实问题往往不在代码而在部署的姿势。这篇文章我会从环境版本搭配、项目导入、Tomcat配置、数据库联调、打包发布到常见问题排查完整走一遍用Myeclipse部署JavaWeb网站的流程。适合刚学Servlet/JSP的学生、接手老项目需要本地跑通的新人以及被各种神级配置折磨到怀疑人生的同行。准备好笔记我们从最枯燥但也最重要的环境开始。1. 部署前先理清版本搭配JDK、Myeclipse、Tomcat1.1 版本关系不是玄学是兼容性在动手之前你得先明白一个概念JavaWeb项目在Myeclipse里部署本质上就是把编译好的class和静态资源塞进Tomcat的过程。而这个过程中JDK、IDE、Tomcat三个版本必须互相兼容否则就会出现类加载失败、JSP编译报错、甚至启动直接崩掉的情况。以我现在的常用组合为例JDK 1.8 MyEclipse 2017 CI Tomcat 8.5。这套组合在我见过的大部分老项目中都能稳定运行。Tomcat 9可以看作Tomcat 8.5的升级版绝大多数项目也能跑但跨到Tomcat 10就要小心了——Tomcat 10把Servlet API的包名从javax.servlet改成了jakarta.servlet如果项目里用的是老写法部署后必现ClassNotFoundException。提示遇到“项目在我机器上明明能跑到你那就报错”的情况九成是版本没对齐。先问对方JDK和Tomcat版本再动手部署。1.2 环境变量和IDE内存设置环境变量这块JAVA_HOME指向JDK安装目录CATALINA_HOME指向Tomcat目录。这里有个容易犯的迷糊操作把JAVA_HOME配置成JRE目录。如果你在命令行运行java -version能找到但Tomcat启动报“找不到JAVA_HOME”多半就是这个原因。JDK里包含了JRE所以JAVA_HOME应该指向JDK的根目录而不是jre子目录。Myeclipse自身的内存设置也要处理。默认的eclipse.ini对老机器来说太保守部署大型项目时容易卡死或直接闪退。我的经验是把内存参数调大一些-Xms256m -Xmx1024m -XX:MaxPermSize256m如果是JDK 8及以上版本MaxPermSize这个参数会被忽略因为它针对的是老版本JDK的永久代不必纠结写上也无妨不会报错。重点是-Xmx它决定IDE能申请到的最大堆内存。部署那种动辄几十个JSP页面、几十个jar的老项目512M以下的内存设置基本就是给自己找罪受。1.3 热词“myeclipse exe4j 外部依赖 打包 可执行 exe 文件”的澄清搜索结果里经常出现“Myeclipse打包exe”的诉求我先把结论放在这如果你做的是JavaWeb项目Myeclipse本身不能直接把它打成exe你需要一个内嵌Tomcat的思路如果你做的是Swing/JavaFX桌面程序用exe4j这类工具就对了。这俩场景完全不冲突后文第5章我会专门展开讲怎么做现在先别急着跳过去。2. 把项目导入Myeclipse并看懂工程结构2.1 导入老项目的完整流程拿到一个同事或老师给的JavaWeb项目多数情况下它是一个完整的Myeclipse/Eclipse工程目录里面带着.classpath、.project这样的隐藏文件。这时用File - Import - General - Existing Projects into Workspace来导入。有个细节建议你养成习惯在Import窗口里勾选Copy projects into workspace。解释一下原因如果你不勾选项目引用的是原来的磁盘路径一旦原目录被移动、改名或清理工程就直接“失联”了复制一份到workspace里后续操作可以随便折腾失败了删掉重来也不会影响原始文件。这个习惯让我少踩了很多坑强烈建议你照做。导入成功后如果项目图标上没有地球样式的Web标识说明它没有被识别为Web项目。这时候右键项目 -Properties - Project Facets勾选Dynamic Web Module并选择版本老项目一般3.0/3.1。如果不勾选你会发现后面配置Tomcat时这个项目根本没有“Add”到Server的选项。2.2 WebRoot目录结构务必要看懂Myeclipse的项目结构和IDEA的JavaWeb项目结构有个显著差异Myeclipse使用WebRoot作为Web根目录而新版IDEA默认叫webapp。很多从IDEA切过来的人会在这一步懵掉。WebRoot下面通常长这样WebRoot/ ├── WEB-INF/ │ ├── web.xml │ ├── classes/ │ └── lib/ ├── index.jsp ├── css/ ├── js/ └── images/WEB-INF目录是规则保护区域。Tomcat允许浏览器直接访问WebRoot下的index.jsp、css、js这些路径但任何在WEB-INF里面的文件都不允许通过URL直接访问必须经过服务端转发。所以web.xml里配置的Servlet路径转发目标如果是/WEB-INF/views/xxx.jsp那是合规玩法如果你想直接http://localhost:8080/项目名/WEB-INF/web.xml去看配置那必定是404。WEB-INF/lib是Project依赖的jar存放地。注意放进这个目录的jar会自动进入Tomcat的类加载路径不需要再右键Add to Build Path。反过来只做Build Path引入而在lib目录里没有实际文件部署到Tomcat之后大概率ClassNotFound。这条规则几乎能解释一半的“本地正常、部署就崩”问题。2.3 热词“myeclipse webroot 项目名”是什么意思你搜“myeclipse webroot 项目名”很多人问的是上下文路径的问题。在Myeclipse里右键项目 -Properties - Web能看到Web Context-root默认值就是项目名。这个值决定了访问URL的第一段路径http://localhost:8080/项目名/页面路径如果你把Web Context-root改成ROOT或空字符串访问URL就变成了http://localhost:8080/页面路径相当于部署在Tomcat根路径。这里有个新手常见的认知误区菜单里的项目名不能代表部署后的访问路径你得看Web Context-root或war包文件名。要保持路径和项目名一致省得后面自己访问时都搞不清该敲哪个URL。2.4 编译输出目录的设置老版本Myeclipse的项目默认编译输出到WebRoot/WEB-INF/classes这样部署时class文件跟着WebRoot一起走逻辑很顺。如果你发现导入项目后WEB-INF/classes是空的编译的class不知道跑哪去了就在项目属性里找到Java Build Path - Source标签页检查Default output folder是不是指向了WebRoot/WEB-INF/classes。这个配置不对项目编译能成功但Tomcat启动后找不到Servlet类。3. 配置Tomcat并完成本地部署3.1 绑定运行环境与Server视图Myeclipse自带了一个内置Tomcat但我一直不推荐用它做日常开发。理由很实际内置Tomcat版本老旧、控制台日志输出不全、出了问题想单独重启还要等IDE响应。我更习惯配置一个外部的Tomcat实例。操作路径Window - Preferences - Servers - Runtime Environment - Add选择你本机安装的Tomcat版本指定Tomcat安装目录和对应的JDK。这里有个细节Tomcat启动时的JVM参数。如果你的项目用了比较大的内存或者要设置编码可以在Server的Open launch configuration或双击Server视图里的Tomcat实例在Arguments里的VM arguments里加参数-Xms256m -Xmx1024m -Dfile.encodingUTF-8我自己的习惯是一律在Server配置里指定文件编码因为老项目的JSP页面很可能是GBK而Myeclipse的默认工作区编码可能不是GBK不统一指定就会乱码奇遇记。3.2 添加项目并启动在Servers视图下右键Tomcat实例 -Add and Remove把左侧的项目加到右侧然后点启动按钮。等Console输出日志不再刷新出现Server startup in xxx ms这样的字样就说明启动成功了。启动日志是个宝贝别忽略。老手看部署状态基本都靠它如果项目没有成功Deploy启动日志里一定会出现Deployment is out of date或者Error during deployment。启动成功后在浏览器访问http://localhost:8080/你的项目名/index.jsp如果你的访问路径跟我这个有出入请回到2.3节检查Web Context-root。3.3 IDEA跑JavaWeb项目的配置逻辑现在很多小伙伴是先用IDEA写代码再被要求用Myeclipse部署老项目。IDEA里的Tomcat配置逻辑跟Myeclipse有对应关系你可以把它当参考系IDEA的Run Configuration - Deployment - Application context对应Myeclipse的Web Context-rootIDEA里的Server - URL会自动带上上下文路径Myeclipse里的访问URL需要你自己拼接。理解了这一层你在两个IDE之间切换就不会觉得部署是两套完全不同的知识。3.4 外置Tomcat的另一种部署方式除了在Myeclipse里管理Tomcat你还可以直接把项目部署到外部Tomcat方法是把WebRoot下的内容整个复制到Tomcat的webapps/项目名/目录下。这其实就是在模拟war包解压后的效果。手动操作时别把WEB-INF漏掉不少新手把JSP和class放对了却忘了lib里那一堆jar结果启动报错。4. 带数据库的完整案例部署MySQL联调4.1 数据库连接配置到底改哪很多JavaWeb完整案例的教学项目都是Servlet JSP MySQL的组合跑到部署阶段最常见的报错已经从404变成了数据库连不上。这时候你要知道连接配置的文件位置。常见配置文件名我有必要列一下因为每个项目模板的命名习惯不一样src/jdbc.propertiessrc/db.propertiessrc/c3p0-config.xmlWEB-INF/classes/jdbc.properties以最常见的jdbc.properties为例jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/yourdb?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456如果你用的MySQL是8.x驱动类名要换成com.mysql.cj.jdbc.Driver同时URL里的serverTimezone和useSSL参数必须带上否则驱动初始化会直接报时区错误。4.2 驱动版本与字符集的坑驱动jar版本不匹配是数据库联调里的大坑之一。MySQL 5.x配mysql-connector-java 5.1.xMySQL 8.x配mysql-connector-java 8.0.x。混用的典型症状连接报Unsupported protocol或者Communications link failure。另外数据库本身的编码也要统一。建库时建议使用CREATE DATABASE yourdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;utf8mb4和utf8的区别在于emoji和生僻字的支持。很多老项目只用了utf8如果你的数据里有特殊字符插入会失败。在连接参数里加上characterEncodingutf8同时保证数据库、连接串、JSP页面三端编码一致乱码问题基本能根治。老项目如果页面还在用contentTypetext/html; charsetGBK那你得优先保持页面编码和数据库存储编码一致别盲目统一到UTF-8。4.3 初始化数据脚本的执行顺序部署带MySQL的完整案例时通常会附带一个.sql脚本。执行顺序有讲究先建库再建表最后插数据。直接双击脚本文件在Navicat里执行也是可以的但你得先确认脚本里有没有CREATE DATABASE语句。如果没有你需要手动建同名库然后USE它再执行建表语句。如果项目用了Hibernate或MyBatis建表可能由ORM自动完成。Hibernate配置hibernate.hbm2ddl.autoupdate时会自动建表但如果你同时手动导入了表结构两者可能会冲突。我的习惯是部署老项目优先按脚本手动建库建表然后关闭ORM的自动建表功能因为自动建的表结构往往和代码里的SQL对不上。执行完脚本后先在数据库客户端里跑一条SELECT确认数据真的进去了再去启动Tomcat。这一步能帮你把问题边界划清楚如果数据都有了Tomcat启动后页面还是报SQLException那就是SQL语句本身或驱动的问题跟数据库初始化无关。5. 打包发布war包与exe文件的扩展玩法5.1 最可靠的发布方式导出war包如果在本地跑通了要发布到远程服务器我推荐用war包而不是直接复制整个目录。在Myeclipse里右键项目 -Export - WAR file选择输出路径一路下一步完成导出。war包本质上就是一个带WEB-INF/web.xml的zip文件。把它放到Tomcat的webapps目录下启动Tomcat时会自动解压成目录。如果你的项目名带空格或中文war包文件名也要避开这些字符否则Linux环境下可能出现奇奇怪怪的解压问题。验证部署是否成功别急着打开浏览器可以先在命令行里确认curl -I http://服务器IP:8080/项目名/index.jsp返回200 OK就说明服务端口和项目上下文路径都正常。如果返回404排查顺序是Tomcat是否启动 - war包是否解压 - URL的上下文路径是否与war包文件名一致。5.2 为什么有人想把JavaWeb项目打包成exe文件热词里频繁出现“myeclipse exe4j 外部依赖 打包 可执行 exe 文件”这背后其实是两类需求第一类写的是桌面程序Swing/JavaFX/AWT用Myeclipse写完想让用户双击就能运行不想让客户装JDK配环境。这类需求用exe4j或Jsmooth很合适。第二类写的是JavaWeb项目想做成exe本质上是想把Tomcat一起打包进去让服务成为“绿色版”。这类需求的实现思路是用Spring Boot或嵌入式容器把项目打包成可执行jar再用exe4j把jar包包裹成exe。但请注意传统的Servlet/JSP项目没有内嵌容器直接打exe并不现实你需要先把项目改造或选用带内嵌容器的方案否则就是绕远路。5.3 exe4j打包含外部依赖时的关键步骤先说清楚exe4j的定位它本身不是编译器而是为已经打包好的Java jar程序做一层原生壳负责找JRE、带参数启动Java进程。所以它的前提是你手里得有一个能通过java -jar跑起来的jar包。在Myeclipse里把程序打成可执行jar包我推荐用Export - Runnable JAR file在启动配置里选择主类Library handling选择Extract required libraries into generated JAR或Package required libraries。如果你用的还是老式的Export - JAR file生成的jar包里不会包含第三方依赖运行时会一直报ClassNotFound这就是“外部依赖”四个字的由来。exe4j的配置界面关键要素我整理如下配置项建议值/操作说明Executable Name程序名.exe输出文件名尽量英文Main Class包含main方法的完整类名比如com.example.MainClassClass Path包含所有依赖jar或指向lib目录必须覆盖所有第三方依赖JVM Parameters-Dfile.encodingUTF-8 -Xmx512m防止中文乱码、限制内存JRE Search勾选Use installed JRE或指定内置JRE目录客户机没装JDK也能跑VM参数里加-Dfile.encodingUTF-8是我的血泪经验。Windows默认编码是GBKWindows的纯Java程序如果不显式指定UTF-8读写文件时很容易乱码。在exe4j里这个参数配置在VM Parameters字段别漏。5.4 exe4j过程中必须避开的三个雷用exe4j打包被问得最多的问题集中在三处雷区一32位/64位不匹配。exe4j生成的exe是有位数概念的必须和JDK/JRE的位数一致。你机器装的是64位JDK那就不能在32位模式下生成exe否则双击会提示“不是有效的Win32应用程序”。雷区二JRE搜索路径失效。客户机器如果没装JDK你需要在exe4j的JRE搜索页面指定一个内置JRE把JRE和exe放在同一级目录。否则exe在不同机器间拷贝后找不到JRE直接闪退客户只会说“你的程序打不开”。雷区三主类写错或清单文件缺失。如果jar包里没有Main-Classexe4j也找不到入口。可以在生成jar包时检查META-INF/MANIFEST.MF确认Main-Class:这一行存在且类名正确。6. 常见问题与排查技巧实录6.1 高频问题速查表直接上干货这些都是我在实际部署中反复遇到的场景你大概率也会碰到。现象可能原因排查顺序访问项目URL报404上下文路径不对、项目没启动成功、war包没解压先看启动日志再核对URL中的项目名页面报ClassNotFoundExceptionWEB-INF/lib没有实际jar文件检查lib目录物理文件确认Build Path与lib一致Tomcat启动失败端口占用另一个Tomcat或Java进程占用了8080netstat查看端口占用taskkill对应PID控制台中文乱码JVM参数未设置UTF-8或页面编码不一致在Tomcat启动参数加-Dfile.encodingUTF-8数据库连接超时或拒绝连接串写错、驱动版本不匹配、数据库没启动用数据库客户端测试同一个连接串老项目JSP编译报错JDK版本太新切换到项目建成的JDK版本低版本兼容高版本项目更容易出问题6.2 端口占用问题的完整处理端口占用是Tomcat启动报错里最经典的一类。Windows下命令行执行netstat -ano | findstr 8080然后你会看到一行记录最后一列就是进程PID。再执行taskkill /F /PID 该进程的PID把占用进程杀掉后重启Tomcat。注意tomcat插件的“8080”是默认端口一些项目会改成80或8088。如果你改了端口上面命令里的8080要跟着换成对应端口。在conf/server.xml里搜Connector port就能看到当前位置的端口。6.3 我私藏的4个排查习惯第一个习惯是先看日志再看代码。遇到部署问题我基本不看代码先打开Tomcat的日志。Myeclipse底部Console虽然方便但历史日志会被清掉。Linux服务器上部署的老项目也可以直接看catalina.out和localhost.yyyy-MM-dd.log项目自身的异常页面控制台的详细堆栈都记录在这里。定位速度比在代码里乱翻快十倍。第二个习惯是Clean Project之后重新部署。Myeclipse的增量编译在某些老旧场景下会陈旧你改了Java文件编译产物没有同步更新部署到Tomcat里跑的还是旧class。遇到诡异问题右键项目 -Clean...把Server里的项目移除再重新Add启动一次。这一套组合拳能解决不少“明明改对了但没生效”的问题。第三个习惯是保留一个纯净的Tomcat副本。我电脑上专门有一个“原始Tomcat”文件夹这个目录没做过任何配置只用来验证war包能不能启动、依赖缺不缺、JAR包到底有没有拉进去。这个副本检查过的问题往往比我在IDE里折腾半天更接近真相。第四个习惯是路径一律用英文。早期的JavaWeb项目生命周期长老Tomcat对中文路径、中文项目名的支持并不完善在Windows环境下很容易出现JSP编译失败或资源读取不到。现在用新版本也可能没问题但既然能避免就图个安稳。6.4 部署态与开发态的差异要心里有数最后说个容易被忽略的点开发时你在Myeclipse里跑得通的项目部署到服务器上不见得能跑。差异主要在路径上。你在JSP或Servlet里写的new File(xxx.txt)在开发环境中可能指向了工作空间目录在Tomcat环境里却指向了Tomcat的bin目录。解决方式就是不要在代码里裸写相对路径要么用ServletContext.getRealPath()要么用classpath下的资源。类似的问题还有本地MySQL能连服务器怎么都连不上检查一下服务器的防火墙和MySQL的远程访问权限。MySQL默认只允许本地连接服务器上要开放bind-address和用户host权限否则你从别的机器连过去永远是access denied。做JavaWeb部署这件事说实话没有太多高深的学问绝大多数问题都出在环境、路径和类加载这三件事上。你只要把一个项目从头到尾跑通过一次后面换IDE、换Spring Boot、换服务器本质上遵循的是同一套治理思路。我的个人体会是遇到问题不要急于改配置先把日志完整读一遍再动手。读日志这个习惯帮我节省的时间远超过任何快捷键和插件。最后再分享一个冷门的小技巧如果你发现自己反复在Tomcat和项目目录之间复制文件建一个批处理或脚本去完成复制、重启、等日志输出这一套动作你会回来谢我的。
返回列表