项目作为依赖项未打包在 .war 文件中

发布于 2025-01-15 01:33:35 字数 2135 浏览 0 评论 0原文

我有一个 Jersey Tomcat 项目 B,它依赖于另一个类似的项目 A,我正在 Eclipse 上开发。

当我单独运行 A 时,它运行没有问题。其构建路径的导出配置为:

在此处输入图像描述

A 的部署程序集是:

在此处输入图像描述

然后,对于项目 B,我将项目 A 导入到 java 构建路径中像这样:

“输入图像此处描述"

项目 B 的构建路径如下所示:

在此处输入图像描述

项目 B 的 Web 部署程序集为:

在此处输入图像描述

项目 A 被列为 .war,我是不确定这是否与该问题有关。项目 A 的 pom.xml 将 war 列为打包:

<packaging>war</packaging>

项目 B 的 pom.xml 提到了项目 A,如下所示:

    <dependency>
        <groupId>some.project.A</groupId>
        <artifactId>flocktracker</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

Eclipse 不会显示任何问题,直到我尝试在 Tomcat 服务器中部署时,我收到此错误:

java.lang.NoClassDefFoundError: some/project/A/SomeClassInA
    at some.project.B.SomeClassInB.<init>(SomeClassInB.java:##)

如果它有帮助,SomeClassInA 是 org.glassfish.jersey.server.ResourceConfig 的实现。

Web.xml 文件中提到了 SomeClassInA,如下所示:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>some.projectA.SomeClassInA</param-value>
</init-param>

SomeClassInA 是 javax.ws.rs.ext.ContextResolver 的实现

我使用右键单击 project >出口> WAR 文件 来检查文件的内容,但我在 WEB-INF/classess 或 .war 文件中的其他位置找不到项目 A 的类。

我是否遗漏了什么或我做错了什么?

谢谢!

I have a Jersey Tomcat project B that depends on another similar project A, I am developing on Eclipse.

When I run A on it's own, it runs with no problems. The export configuration for its build path is:

enter image description here

And the deployment assembly for A is:

enter image description here

Then, for project B, I imported project A into the java build path like this:

enter image description here

The build path for project B looks like this:

enter image description here

And the web deployment assembly for project B is:

enter image description here

Project A is listed as a .war, I am not sure if this is related to the issue. The pom.xml for project A lists war as packaging:

<packaging>war</packaging>

The pom.xml for project B mentions project A like so:

    <dependency>
        <groupId>some.project.A</groupId>
        <artifactId>flocktracker</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

Eclipse doesn't show any issues until when I try to deploy in a Tomcat server, whe I get this error:

java.lang.NoClassDefFoundError: some/project/A/SomeClassInA
    at some.project.B.SomeClassInB.<init>(SomeClassInB.java:##)

If it helps, SomeClassInA is an implementation of org.glassfish.jersey.server.ResourceConfig.

SomeClassInA is mentioned in the web.xml file like so:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>some.projectA.SomeClassInA</param-value>
</init-param>

SomeClassInA is an implementation of javax.ws.rs.ext.ContextResolver<T>

I used right click on project > export > WAR file to examine the contents of the file and I couldn't find the classes of Project A on WEB-INF/classess or elsewhere in the .war file.

Is there something I am missing or that I am doing wrong?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝天 2025-01-22 01:33:35

将 Eclipse 工具放在一边,从 Maven 配置的角度来看:

  • Maven 不会从 WAR 工件加载类,因为它会从 JAR 工件加载。
  • 理想情况下,WAR 工件不应用作依赖项,除非您正在构建最终的 EAR 工件。

您有以下选择。所有这些都需要对 ProjectB 进行修改:

  • 虽然这是最不可能的情况,但如果 ProjectA 不用于部署 Web 应用程序,您可以将其打包更改为 jar
  • 您可以将所有必需的类移动到一个单独的模块中构建一个 JAR,并在 ProjectA 和 ProjectB 中使用此依赖项。
  • 如果您不想将类移动到另一个模块/项目,您可以使用 true 在 ProjectA 中配置 war 插件,以在 war 工件旁边生成 jar 工件
<project>
    ...
    <artifactId>yourWebapp</artifactId>
    <version>yourVersion</version>
    ...
    <build>
      <plugins>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
              <attachClasses>true</attachClasses>
            </configuration>
          </plugin>
      </plugins>
    </build>
    ...
</project>

这会在 ProjectA 中生成一个类工件,该工件可在 ProjectB 中用作 classes 的依赖项

<dependency>
    <groupId>yourGroupId</groupId>
    <artifactId>yourWebapp</artifactId>
    <version>yourVersion</version>
    <classifier>classes</classifier>
</dependency>

Keeping the Eclipse tooling aside, from a Maven configuration perspective:

  • Maven does not load classes from a WAR artifact, as it would load from a JAR artifact.
  • Ideally WAR artifacts are not supposed to be used as a dependency, unless you're building a final EAR artifact.

You have the following choices. All of them require a modification to ProjectB as well:

  • Although this is the least likely case, if ProjectA is not used for deploying a web application, you could just change its packaging to jar
  • You could move all the required classes to a separate module that builds a JAR, and use this dependency in both ProjectA and ProjectB.
  • If you do not want to move the classes to another module/project, you can configure the war plugin in ProjectA to generate a jar artifact alongside the war artifact, using <attachClasses>true</attachClasses>
<project>
    ...
    <artifactId>yourWebapp</artifactId>
    <version>yourVersion</version>
    ...
    <build>
      <plugins>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
              <attachClasses>true</attachClasses>
            </configuration>
          </plugin>
      </plugins>
    </build>
    ...
</project>

This produces a classes artifact in ProjectA, which can be used in ProjectB as a dependency with <classifier>classes</classifier>

<dependency>
    <groupId>yourGroupId</groupId>
    <artifactId>yourWebapp</artifactId>
    <version>yourVersion</version>
    <classifier>classes</classifier>
</dependency>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文