7

我有依赖

    <dependency>
        <groupId>de.matthiasmann</groupId>
        <artifactId>twl</artifactId>
        <version>1.0.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/TWL.jar</systemPath>
    </dependency>

然后我执行mvn assembly:assembly. 添加了所有本地文件和远程 maven 库,但没有这个 jar。

更新

当我试图运行应用程序时java -jar myjar.jar。它返回一个错误,即上述依赖项中没有类 (NoClassDefFoundError : de.matthiasmann.twl.ForExample)。我想将此 jar 中的类添加到 myjar.jar(与 maven 对远程依赖项所做的相同)。我如何配置 Maven 来做到这一点?

4

4 回答 4

8

请参阅Maven 2 assembly with dependencies: jar under scope "system" not included,了解为什么不包括系统依赖项以及如何解决它,特别是mvn install:install-file代码是您想要的。

于 2012-11-13T01:34:28.940 回答
8

除非您的 Java EE 服务器/容器配置了该 jar,否则您不能使用 systemPath。

请记住,maven 只是开发和编译时间。一旦构建了war文件,maven除了将所有需要的jar放入WEB-INF/lib文件夹之外没有任何作用。

当您指定系统范围时,这意味着您有责任确保在部署战争时该 jar 存在。您已经有一个框架来执行此操作,并且您不希望使用该 jar 来阻碍您的构建依赖项,但您必须仅在开发期间通过 Maven 使其可用。

另一个类似的范围是“提供的”。例如,JBoss 或您的公司公共部署 Tomcat 框架已经提供了许多 jar,例如 Spring 和 Hibernate,它们由服务器启动加载并且对服务器中的所有应用程序都是通用的。因此,您不希望 maven build 将它们包含在 war 文件中。

正确的方法,Maven 大师会告诉你。是拥有自己的 maven 服务器并在该服务器中构建您需要的任何工件。但是,有时这是不可能的。

因此,在这种情况下,我会创建与项目一起分发的项目级存储库并签入版本控制。我运行命令mvn install来创建一个名为“project-repo”的项目级目录。

http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html(由于熟悉,大多数时候,我手动构建 repo 而不是运行 mvn install)。

然后在 POM 中,我将 file://${project.basedir}/project-repo 指定为存储库之一。需要注意的是,在 Windows 中,“file://”之后的斜杠以外的斜杠在引用 Windows 文件系统路径时必须是反斜杠。

  <repositories>
    <repository>
      <id>my-repo1</id>
      <name>my custom repo</name>
      <url>http://ho.ho.ho</url>
    </repository>
    <repository>
      <id>project-repo</id>
      <name>my project repo</name>
      <url>file://${project.basedir}\project-repo</url>
    </repository>
  </repositories>
于 2012-11-13T02:00:35.783 回答
1

您可以通过多种方式实现此功能,请参阅下面的博客

http://blog.valdaris.com/post/custom-jar/

于 2014-07-11T12:11:46.603 回答
0

如果您有这样的依赖项,最好的解决方案是首先使用存储库管理器,然后将该依赖项简单地放入存储库管理器,然后将其用作简单依赖项。

于 2012-11-13T08:40:11.940 回答