当前位置: 首页 > 知识库问答 >
问题:

除了使用mvn clean包之外,如何以稳定方式将servlet项目添加到Eclipse中的Tomcat服务器中

乜思淼
2023-03-14

我在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");

        // doing more stuff, registering resources ...
    }
}

该项目在我的Eclipse中本地运行,它也启动和停止Tomcat。在我的项目旁边有一个服务器。

我已经根据Eclipse中的运行配置检查了服务器和部署路径,它们应该匹配。

<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.1.1</version>-->
  <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>
        <!-- https://stackoverflow.com/a/33390519/2092322 annotations instead of web.xml -->
        <failOnMissingWebXml>false</failOnMissingWebXml>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
            </manifest>
          </archive>
          <warName>my-project</warName>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
        <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>
        <!-- maybe use jakarta mail? javax.mail 1.4.x? -->
        <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>

# server.xml in tmp folder after starting the server (*run on server*)
<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>

# same part of server.xml in Server folder of server project in Eclipse after having the servlet project configured for (added to) server 
<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>

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.

所以我需要:

  1. 将项目与Tomcat服务器解耦
  2. 当我刚刚在服务器上再次运行它时,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"/>*
  <projects>
+    <project>Servers</project>
  </projects>

我很确定我在某个地方有一个错误的配置,除了Eclipse之外,我希望使用MVN。但我到底做错了什么?

需要更多的配置材料吗?

共有1个答案

郎伟兆
2023-03-14

最关键的变化是

  1. 从项目引用中删除Eclipse服务器
  2. 将执行环境设置为javase-11(请参见屏幕截图1)
  3. 使用正确的部署程序集(请参见屏幕截图2),因此MVN clean package并让服务器与servlet项目一起运行,因为源代码会创建相同的结果。另请参见此SO答案。
 类似资料:
  • 我无法将我的项目添加到Eclipse中的服务器-为什么? 我安装了所有必要的工具(Web Dev、Java EE、服务器适配器和Tomcat本身,一切) 我配置了运行时环境,将所有Java版本调整为JDK 6(因为它应该在Tomcat 6上运行),但是在创建新服务器时,我可以添加资源的对话框的左侧仍然是空的。 我还能试什么? PS:我在Windows上使用的是Eclipse v4.2 (Juno)

  • 环境 : Windows Eclipse Luna Service Release 2 (4.4.2) Tomcat 8 JDK 8 当我尝试使用

  • 我尝试在server.xml中添加一个新的docbase,以便在我的tomcat服务器中定义一个上传目录。然而,如果我将它添加到我的独立tomcat服务器上,它会像魔咒一样工作: 但是在我的本地eclipse tomcat服务器配置中它不起作用。我的发布操作是“更新上下文路径”,我在服务器选项卡中使用“工作区元数据”。 知道我哪里做错了吗?

  • 问题内容: 我已经阅读了很多SO和Google链接。 我还没有弄清楚如何正确地将图像添加到eclipse gui项目中,这样系统可以识别找到它。我知道有一些关于CLASSPATH的小技巧,但做起来可能并不难。 让我先描述一下我在做什么…(如果有人可以纠正我,我将不胜感激。) 这是我的方法。 我使用“导入向导”(右键单击,“导入”,“常规”,“文件”)将图像添加到我称为“ / resources”的

  • 问题内容: 我设法下载了Eclipse Helios的svn插件。然后,我设法将一个新的存储库添加到我选择的驱动器中。但是我看不到如何知道已经创建的项目?有人可以告诉我我该怎么做。 谢谢 问题答案: 就像是: 右键单击您的项目。 选择团队->共享项目。 该向导将指导您进行初始导入。 实际上,Initial Import不会将任何代码放入项目存储库中,而只是将项目详细信息放入仓库中。因此,您需要执行