构建包含专有库的maven项目[重复]

Posted

技术标签:

【中文标题】构建包含专有库的maven项目[重复]【英文标题】:build maven project with propriatery libraries included [duplicate] 【发布时间】:2011-05-28 07:58:43 【问题描述】:

如何创建 maven pom,这将使项目可构建,我可以直接在我的项目中包含专有 jar,而无需从存储库中获取它们吗?以前有人做过吗?

编辑:

我不想通过使用依赖项 jar 构建程序集来使其可运行,我希望它是可构建的。因此,任何拥有此项目的人都可以构建它,即使在任何存储库中都找不到 jar。

【问题讨论】:

如果您的库有时会更新或扩展,请参阅 this answer 至 I want to load all JARs from my libs project folder with maven 以获得“pomified”方式,从而避免额外的 repo 文件夹和繁琐的 cmd 行或 install-file 脚本。跨度> 【参考方案1】:

真正快速而肮脏的方法是指向本地文件:

<dependency>
      <groupId>sampleGroupId</groupId>  
       <artifactId>sampleArtifactId</artifactId>  
       <version>1.0</version> 
      <scope>system</scope>
      <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>

但是,这只会存在于您的机器上(显然),对于共享,使用适当的 m2 存档(nexus/artifactory)通常是有意义的,或者如果您没有这些存档或不想设置一个本地 Maven 结构化存档并在您的 pom 中配置“存储库”:

本地:

<repositories>
    <repository>
        <id>my-local-repo</id>
        <url>file://C:/DEV//mymvnrepo</url>
    </repository>
</repositories>

远程:

<repositories>
    <repository>
        <id>my-remote-repo</id>
        <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
    </repository>
</repositories>

【讨论】:

&lt;scope&gt;system 现已弃用。 就像我写的“又快又脏”,所以被弃用是有充分理由的。【参考方案2】:

您可以从本地驱动程序获取它,如下所示:

<dependency>
    <groupId>sample</groupId>
    <artifactId>com.sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>$project.basedir/src/main/resources/yourJar.jar</systemPath>
</dependency>

【讨论】:

&lt;scope&gt;system 现已弃用。【参考方案3】:

可能的解决方案是将你的依赖项放在 src/main/resources 中,然后放在你的 pom 中:

<dependency>
groupId ...
artifactId ...
version ...
<scope>system</scope>
<systemPath>$project.basedir/src/main/resources/yourJar.jar</systemPath>
</dependency>

注意:系统依赖不会复制到生成的 jar/war (见How to include system dependencies in war built using maven)

【讨论】:

此解决方案不起作用。以下是错误消息:dependencies.dependency.systemPath' for groupId:yourJar:jar should not point at files within the project directory, $project.basedir/src/main/resources/yourJar.jar will be unresolvable by dependent projects +1 解决方案对我有用,所以这不是一般问题。 &lt;scope&gt;system 现已弃用。【参考方案4】:

在 Maven 项目的根目录下创建一个新文件夹,例如 local-maven-repo

只需在您的&lt;project&gt; 或您的pom.xml 旁边添加一个本地存储库:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///$project.basedir/local-maven-repo</url>
    </repository>
</repositories>

然后对于您要安装的每个外部 jar,进入项目的根目录并执行:

mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]

(复制自my reply on a similar question)

【讨论】:

【参考方案5】:

在您的项目下创建一个存储库文件夹。让我们来

$project.basedir/src/main/resources/repo

然后,将您的自定义 jar 安装到此 repo:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

最后,在项目 pom.xml 中添加以下 repo 和依赖定义:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://$project.basedir/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

【讨论】:

我使用了相同的技术,但使用了mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:src/main/resources/repo/ -DrepositoryId=project-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]。你可以see my answer here 我正在尝试这样做,但我的设置仍然指向 coprorate artifactory 并且它忽略了本地 repo【参考方案6】:

您可以使用 maven-assembly-plugin 并创建一个包含所有依赖项的 jar。

【讨论】:

这不是我要问的,我不希望它是可运行的,我希望它是可构建和可运行的。如果我将我的项目发送给您,您将无法构建它,因为您没有我的专有库并且项目使用它。但是,如果我向您发送了 assembly jar ,您就可以运行它。【参考方案7】:

为什么不运行 Nexus 之类的东西,您自己的 maven 存储库,您可以上传 3rd 方专有 jar 文件,还可以代理其他公共存储库,以节省带宽?

This 也有一些很好的理由来运行您自己的 maven 存储库管理器。

【讨论】:

当你有一个使用 maven 的团队时,像 Nexus 这样的 repo 管理器是合理的。对于一个开发者来说,对我来说毫无意义。 Nexus 很容易设置,对我来说确实很有意义。我对自己的研究项目有自己的联系,因为我厌倦了总是手动安装 jar。【参考方案8】:

我认为这里的“正确”解决方案是将您的专有库添加到您自己的存储库中。它应该很简单:为您的库项目创建 pom 并将编译后的版本发布到您的存储库中。将此存储库添加到您的邮件项目的存储库列表中并运行构建。我相信它会为你工作。

【讨论】:

他指出:“因此,任何拥有此项目的人都可以构建它,即使在任何存储库中都找不到 jar。”并且“不必从存储库中取出它们”。我不知道为什么 maven 人如此喜欢公共存储库的想法:)【参考方案9】:

实现此目的的一个好方法是拥有一个 Maven 镜像服务器,例如 Sonatype Nexus。它是免费的并且非常容易设置(Java Web 应用程序)。使用 Nexus,您可以拥有私有(团队、公司等)存储库,能够将第三方和内部应用程序部署到其中,同时还将其他 Maven 存储库注册为同一服务器的一部分。这样,本地 Maven 设置将仅引用一个私有 Nexus 服务器,所有依赖项都将使用它解决。

【讨论】:

【参考方案10】:

您可以将 jar 添加到项目中并使用 maven-assembly-plugin,或者将 jar 添加到本地存储库:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=true

Where: <path-to-file>  the path to the file to load
       <group-id>      the group that the file should be registered under
       <artifact-id>   the artifact name for the file
       <version>       the version of the file
       <packaging>     the packaging of the file e.g. jar

【讨论】:

这不是我真正想要的答案,想象一下:你下载我的项目,你可以构建它,而不需要从你身边 appart mvn clean install 命令进行任何交互 @London 感谢您的澄清。我想我现在明白了。 AFAIK,文件夹 src/main/resources 最终会出现在项目类路径中,但其中的 jar 不会在路径上枚举。我隐约记得用“内部 jars”配置项目,但还没有找到。【参考方案11】:

1 您可以在应用程序的类路径中包含该 jar2 您可以通过

在您的 maven reopos 中安装特定的 jar 文件
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
    -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

【讨论】:

life.java 我该怎么做(#1 听起来很有趣)?我可以把我的专有罐子放在 src/main/resources 吗?如何在我的 pom 中引用它? @London 对于场景中没有 POM 的人,您只需将 jar 放入项目的类路径中,您可以通过编写一个将您的 jar 复制到 WEB-INF/lib 的 ant 任务来做到这一点. 这种方法不适合开发团队——只适合单人乐队。 @01es Approch one 适用于团队,对于 2 每个人必须做一次。 +1 给你的方法,但我觉得对于一个罐子来说,你的方式太多了 有一个类似的解决方案,这取决于您是否拥有像 Nexus 这样的本地存储库管理器。它涉及使用mvn deploy:deploy-file 将库推送到存储库,然后所有开发人员都可以使用它。

以上是关于构建包含专有库的maven项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章

可以使Maven构建包含依赖项中的.class文件[重复]

Maven项目已建立,但是在IntelliJ IDEA中似乎没有依赖项

Maven - 在不构建的情况下安装项目依赖项

在maven项目中导入外部jar而不创建依赖项[重复]

Maven - 使用依赖项构建 [重复]

在 Maven 中查看依赖树?