我可以添加罐子到maven 2生成类路径而不安装它们吗?

在实验/快速和肮脏的模拟开发阶段,Maven2令我疯狂。

我有一个pom.xml文件,它定义了我想要使用的web-app框架的依赖关系,并且可以从该文件快速生成入门项目。 但是,有时我想链接到尚未定义pom.xml文件的第三方库,因此不是手动为第三方库创建pom.xml文件并安装它,并将依赖关系添加到我的pom.xml ,我只想告诉Maven:“除了我定义的依赖关系之外,还包括任何在/lib jar。”

这似乎应该是简单的,但如果是这样,我错过了一些东西。

任何指示如何做到这一点非常感谢。 简而言之,如果有一种简单的方法可以将maven指向/lib目录,并轻松创建一个pom.xml并将所有封闭的jar映射到单个依赖项,然后我可以一举命名/安装并链接到该目录。也足够了。


流行方法的问题

你可以在互联网上找到的大部分答案都建议你将依赖关系安装到本地存储库,或者在pom指定一个“系统”作用域,并将依赖项与项目源分配。 但是这两种解决方案实际上都有缺陷。

为什么不应用“安装到本地回购”方法

当你将一个依赖项安装到本地存储库时,它仍然存在。 只要有权访问此存储库,分发工件就会正常工作。 问题是在大多数情况下,这个存储库将驻留在本地计算机上,因此无法解决对其他任何计算机的依赖关系。 清楚地让你的神器依赖于特定的机器不是一种处理事物的方式。 否则,这种依赖性必须在每个使用该项目的机器上进行本地安装,这种情况并不会好转。

为什么不应用“系统范围”方法

您使用“系统范围”方法所依赖的jar既不会被安装到任何存储库,也不会附加到您的目标程序包。 这就是为什么您的发行包在使用时无法解决该依赖性的原因。 我相信这就是为什么系统范围的使用甚至被弃用的原因。 无论如何,你不想依赖一个不推荐的功能。

静态的项目内库解决方案

把它pom你的pom

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

对于具有xyz形式的组ID的每个工件,Maven将在您的项目dir中包含以下位置以搜索工件:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

详细说明这一点,你可以阅读这篇博文。

使用Maven安装到项目回购

我建议使用Maven插件将瓶子安装为工件,而不是手动创建此结构。 因此,要在repo文件夹下将项目安装到项目库中,请执行以下命令:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

如果您选择这种方法,您将能够简化pom的存储库声明,以便:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

助手脚本

由于为每个lib执行安装命令有点麻烦,而且肯定有错误,所以我创建了一个实用程序脚本,它自动将lib文件夹中的所有jar lib到项目存储库,同时自动解析所有元数据(groupId,artifactId等)从文件的名字。 该脚本还会打印出依赖关系xml供您复制粘贴到您的pom

将依赖包括在你的目标包中

当你创建了你的项目库时,你已经解决了项目的依赖关系和源代码的问题,但是从那时起,你的项目的目标项目将取决于未发布的jar,所以当你安装它到一个仓库它将有无法解决的依赖关系。

为了解决这个问题,我建议将这些依赖包括在你的目标包中。 这可以通过Assembly Plugin或OneJar插件更好地完成。 OneJar上的官方文档很容易理解。


仅用于丢弃代码

设置范围==系统,只是组成一个groupId,artifactId和版本

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

注意:系统依赖不会被复制到结果jar / war中
(请参阅如何在使用maven构建的war中包含系统依赖关系)


您可以在您的项目上创建本地存储库

例如,如果在项目结构中有libs文件夹

  • libs文件夹中,您应该创建如下目录结构: /groupId/artifactId/version/artifactId-version.jar

  • 在你的pom.xml中你应该注册仓库

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
    
  • 并照常添加依赖项

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>
    
  • 就这些。

    有关详细信息:如何在Maven中添加外部库

    链接地址: http://www.djcxy.com/p/5037.html

    上一篇: Can I add jars to maven 2 build classpath without installing them?

    下一篇: How do I tell Maven to use the latest version of a dependency?