Eclipse中无需执行mvn clean package的Jersey Servlet项目稳定部署Tomcat
基础项目信息
我有一个运行在Tomcat上的简易Servlet项目,核心代码大致如下:
import javax.ws.rs.ApplicationPath; import org.glassfish.jersey.server.ResourceConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import security.AuthenticationFilter; @ApplicationPath("/") public class MyMain extends ResourceConfig { private final static Logger logger = LoggerFactory.getLogger(MyMain.class); private Map<String,Map<String,String>> myConfig = null; public MyMain() { final String myEnv = System.getProperty("myEnvironment"); // 注册资源等其他业务逻辑 } }
该项目原本可在Eclipse中本地运行,Eclipse可直接启停配套的Tomcat服务器,项目旁关联有对应的服务器配置项。
当前故障现象
Tomcat服务器无法加载启动该Servlet
已核对服务器部署路径与Eclipse中的运行配置,二者路径规则匹配。
项目的pom.xml核心配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>sustainableDataPlatform.org</groupId> <artifactId>my-project</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>MY PROJECT</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.jersey>2.32</version.jersey> </properties> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>11</release> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <archive> <manifest> <addClasspath>true</addClasspath> </manifest> </archive> <warName>my-project</warName> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>${version.jersey}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>${version.jersey}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>${version.jersey}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>${version.jersey}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.14.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.14.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20151123</version> </dependency> <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> <version>4.2.0</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.4.1</version> </dependency> </dependencies> </project>
Eclipse环境下的服务器配置相关结果

启动服务器(在Eclipse中执行Run on Server)后,临时工作目录下的server.xml中Host节点配置如下:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Context docBase="/home/myname/work/sdp/eclipse/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/ROOT" path="" reloadable="false"/> <Context docBase="sdp-api" path="/sdp-api" reloadable="true" source="org.eclipse.jst.jee.server:sdp-api"></Context> </Host>
将Servlet项目添加到服务器配置后,Eclipse服务器项目目录下的同段server.xml配置如下:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Context docBase="sdp-api" path="/sdp-api" reloadable="true" source="org.eclipse.jst.jee.server:sdp-api"/> </Host>
项目目标运行时配置

对「Runtime Composition(运行时组合)」的概念存在疑问,不清楚该项的实际作用。
项目构建路径配置

对构建路径配置中的类路径顺序部分存在疑问,不确定是否存在配置错误。

历史问题记录
执行环境调整经历
曾调整过项目的执行环境,理想状态为服务器侧单向引用Servlet项目,不存在反向依赖。
目前通过Eclipse导出项目可生成正常的my-project.war包,但执行mvn clean package后启动服务器会报错;再次尝试启动时Eclipse抛出如下错误:
Publishing failed with multiple errors File not found: /path/to/my-project/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF. File not found: /path/to/my-project/target/m2e-wtp/web-resources/META-INF/MANIFEST.MF. File not found: /path/to/my-project/target/m2e-wtp/web-resources/META-INF/maven/mainPackage/my-project/pom.properties. File not found: /path/to/my-project/target/m2e-wtp/web-resources/META-INF/maven/mainPackage/my-project/pom.properties. File not found: /path/to/my-project/target/m2e-wtp/web-resources/META-INF/maven/mainPackage/my-project/pom.xml. File not found: /path/to/my-project/target/m2e-wtp/web-resources/META-INF/maven/mainPackage/my-project/pom.xml.
遇到上述问题后,临时执行了如下操作流程:
- 先将项目与Tomcat服务器解绑
- 尝试直接在服务器上运行项目时Servlet无法启动,因此通过Eclipse的项目关联功能将项目重新绑定回服务器

上述绑定操作会自动修改.classpath文件:
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java-11-oracle"> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
同时还会产生如下属性变更:
- <attribute name="owner.project.facets" value="java"/> + <attribute name="maven.pomderived" value="true"/>
疑问点1:上述配置变更代表什么含义?
绑定操作同样会自动修改.project文件:
<projects> + <project>Servers</project> </projects>
目前判断是某处配置存在错误,最终目标是实现既可以使用Eclipse开展开发调试,也能正常通过mvn命令完成项目构建,但暂时无法定位具体的配置问题,需要明确补充哪些配置才能实现上述目标。
内容的提问来源于stack exchange,提问作者BairDev
相关产品推荐
相关产品推荐

