【问题标题】:Maven WAR dependency - cannot resolve package?Maven WAR 依赖项 - 无法解析包?
【发布时间】:2011-08-01 14:59:36
【问题描述】:

我有战争依赖​​:

    <dependency>
        <groupId>my.package</groupId>
        <artifactId>myservices</artifactId>
        <version>0.3</version>
        <type>war</type>
    </dependency>

现在,它存在于我的本地存储库中,并且该类存在于WEB-INF/classes/my/package/myservices。但是,当我使用myservices 时,我得到包my.package 不存在。 Intelli-J 知道将myservices 更改为my.package.myservices,但尝试将import 似乎根本不起作用。

我需要对这种战争依赖做些什么特别的事情吗?

【问题讨论】:

  • 从命令行构建时是否有效? (例如,mvn install?)
  • 意识到我可能偏离了方向。我认为@seanpatrickfloyd 是对的。如果您想使用 war 文件作为依赖项,那么我将尝试使用 maven 程序集插件来查看它是否有帮助。再次抱歉没有对答案进行足够的研究。
  • 如果我使用warpath插件,我可以从命令行构建,但IntelliJ仍然看不到类文件。
  • @doc_180:很好的提示,正是我想要的。我冒昧地将其转换为答案。

标签: java spring maven remoting war


【解决方案1】:

它只是不那样工作。 war 文件不应该放在类路径中,而是部署到可以处理其特殊结构的应用程序服务器(或 servlet 容器)中。

当然,您可能可以在某个地方找到可以处理 java war 文件的自定义类加载器,但这不是这样做的方法。

将您的代码保存在 jar 中,将 jar 包含在您的战争和此应用程序中。但不要将战争用作依赖项,除非您正在构建 EAR 文件。

【讨论】:

  • 我正在使用 grails maven-install 插件,不幸的是它只会构建战争。我真的不需要完整的战争,实际上我更喜欢罐子。
【解决方案2】:

正如其他答案中指出的那样:

  • 在 Maven 中,您不能像从 JAR 工件那样从 WAR 工件加载类。
  • 因此,建议将一个单独的 Maven JAR 项目与您要重用的类分开,并在原始 WAR 和新项目中都依赖该项目。

但是,如果由于某种原因您不能/不想拆分 WAR 项目,您也可以告诉 Maven 除了 WAR 之外您还需要一个 JAR 工件。把它放到你的 WAR 项目的 POM 中:

<build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <attachClasses>true</attachClasses>
        </configuration>
      </plugin>
    </plugins>
  </build>

然后,在构建 WAR 项目时,Maven 将创建一个 WAR一个 JAR。

来源:Maven War plugin FAQ

改编自 doc_180 的评论,所以不会被忽视。

【讨论】:

  • 如果你使用&lt;attachClasses&gt;,你还需要在引用jar的依赖声明中添加&lt;classifier&gt;classes&lt;/classifier&gt;
  • 谢谢。这帮助我帮助了一位同事,并为我赢得了几杯啤酒。
【解决方案3】:

Maven 对 WAR 依赖项的处理与 JAR 依赖项非常不同。它们被视为叠加层。

http://maven.apache.org/plugins/maven-war-plugin/overlays.html

我认为您正在寻找的东西与 WAR 覆盖有点不同。 WAR 覆盖将文件结构与“最接近的胜利”模型合并,但这意味着 web.xml 之类的内容将被最接近的胜利取代,而不是合并。

如果您想要合并(这更接近大多数人在开始谈论 WAR 依赖项时的想法),您应该查看 Cargo uberwar 插件。

http://cargo.codehaus.org/Merging+WAR+files

如果您的目标只是在两个 WAR 之间共享一些类,您可能应该将这些类放入 JAR 项目中。特别是 Maven 真正设计用于处理 pom.xml -> 单个工件模型(JAR/WAR/等)。尝试获取单个 pom.xml 并让它发出,比如说,一个 JAR 用于某些东西,而一个 WAR 用于其他东西将会非常痛苦。

顺便说一句,如果您在一个超过一个人的团队中工作,您将需要一个非常快速的工件管理服务器(例如 Artifactory、Nexus 或 Archiva),否则您会发疯地处理这些东西。 ;)

【讨论】:

  • 我已经在使用 Nexus。我真的只需要类模型,但类模型来自 grails 应用程序。不幸的是,grails maven 插件只会推动战争,我宁愿不尝试做一些不可靠的 create-jar 然后手动安装 jar 步骤作为构建过程的一部分。
  • 啊。是的,这仍然是一个新的工件——很难让它与 WAR 依赖项一起工作。可能会尝试打开 WAR,撕掉你需要的东西,然后将你需要的东西重新打包成 JAR。
【解决方案4】:

在 WAR 中,类必须位于 WEB-INF/classes/... 而不是 classes/...

无论如何,我从未尝试过从 WAR(不是 JAR)中引用其他类,我不知道这是否可行。

【讨论】:

    【解决方案5】:

    确保依赖项已安装在您的本地存储库中。
    本地仓库应如下所示:

    .m2/my/package/myservices/0.3/myservices-0.3.war
    

    如果不是这种情况,则在依赖项中使用之前将war安装到本地存储库中:

    mvn install:install-file -Dfile="[path-to-war]"  -DgroupId=my.package  -DartifactId=myservices -Dversion=0.3 -Dpackaging=war -DcreateChecksum=true -DgeneratePom=true
    

    【讨论】:

      猜你喜欢
      • 2017-05-06
      • 2014-05-03
      • 2017-03-03
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多