构建包含专有库的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>
【讨论】:
<scope>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>
【讨论】:
<scope>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 解决方案对我有用,所以这不是一般问题。
<scope>system
现已弃用。【参考方案4】:
在 Maven 项目的根目录下创建一个新文件夹,例如 local-maven-repo
。
只需在您的<project>
或您的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项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章