ChatGPT解决这个技术问题 Extra ChatGPT

Maven:将自定义外部 JAR 链接到我的项目的最佳方式?

这是我学习 Maven 的头几天,但我仍在努力学习基础知识。我有一个需要在我的项目中引用的外部 .jar 文件(在公共存储库中不可用),我试图找出我的最佳选择是什么。

这是一个小型项目,没有库的中央存储库,因此它必须是本地存储库(以某种方式添加到源代码控制中,不知道它是否应该以这种方式工作?)或者 .jar 需要存储在任何正式存储库之外的磁盘。

1) 考虑到我希望项目和库都在源代码控制中,使用 maven 将 .jar 文件添加到我的项目引用中的最佳选择是什么?

2)我似乎仍然无法让 Eclipse 看到依赖关系。我手动将它添加到 pom 的部分,它在 m2eclipse 的 Dependencies 列表中显示得很好。 mvn compile 和 mvn package 都成功了,但是运行程序会导致:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

这是在将 POM 编辑为:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

我是否应该执行 mvn install:install-file 即使我已经像上面那样编辑了 pom.xml ?

谢谢!


B
BullyWiiPlaza

您可以创建 In Project Repository,因此您不必每次在新计算机上工作时都run mvn install:install-file

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

详细阅读这篇博文

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


使用上述解决方案在执行“mvn clean package”时显示警告 - 项目 的 POM 丢失,没有可用的依赖信息。
或者,您可以直接添加本地依赖项,如 stackoverflow.com/a/22300875/640378
我不得不使用 file:///${project.basedir}/libs (3个转发斜杠)而不是 file://${project.basedir}/libs
如果要安装的 jar 不是 maven 编译的 jar,您还需要添加一个新的 pom 文件来定义元数据。为了省去所有这些手动麻烦,我建议使用 mvn install:install-file,然后将整个目录结构从本地存储库复制到项目内存储库。
请注意,在创建文件夹结构 /groupId/artifactId/version/artifactId-verion.jar 时,不要将包名用作 groupId 的错误;相反,它应该在文件夹树中划分。例如,对于 groupId org.json,路径应该看起来像 org/json/2.0/json-2.0.jar,而不是 org.json/2.0/json-2.0.jar
s
stalker

我认为您应该使用 mvn install:install-file 用库 jar 填充您的本地存储库,然后您应该将范围从系统更改为编译。

如果您从 maven 开始,我建议直接使用 maven 而不是 IDE 插件,因为它增加了额外的复杂性。

至于错误,您是否将所需的 jars 放在类路径中?如果您使用库中的类型,则还需要在运行时访问它。这与maven本身无关。

我不明白您为什么要将库置于源代码管理中 - 它用于源代码而不是二进制 jar。


有关 mvn install::install-file 的更多信息:mkyong.com/maven/…
在您的本地存储库上使用 mvn install::install-file 意味着任何克隆您的源代码的人也必须执行此手动步骤。否则,构建是开箱即用的
但这不会将 jar 添加到 war 文件中。
N
Nathan

这可以通过使用嵌套在 元素内的 元素轻松实现。

例如:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

参考:http://www.tutorialspoint.com/maven/maven_external_dependencies.htm


当您只有 Eclipse Embedded Maven,并且缺少安装插件(离线系统)时,此方法非常有效,因此您无法在依赖的项目上运行 install 目标。 Ofc 有一个气隙系统并拥有除安装插件之外的所有插件,这是非常罕见的情况。
最干净,最简单。
如何添加 ${project.basedir} 文件夹之外的本地依赖路径,就像我想要 ${basedir}\src\lib\ldapjdk.jar 路径 1 在其他文件夹中升级
我收到错误 - "The POM for … is missing, no dependency information available” even though it exists in Maven Repository
j
jacobq

Maven 手册says to do

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

此命令将 lib 安装到您的 maven 存储库中。这样做的缺点是,如果您尝试在另一台计算机上处理项目,则必须再次运行它。
u
uı6ʎɹnɯ ꞁəıuɐp

更新我们刚刚安装了我们自己的 Nexus 服务器,更容易和更清洁。

在我们公司,我们有一些罐子,有些罐子很常见,但没有托管在任何 maven 存储库中,我们也不希望将它们放在本地存储中。我们在 Github 上创建了一个非常简单的 mvn(公共)存储库(但您可以将它托管在任何服务器上或本地):请注意,这仅适用于管理一些很少更改的 jar 文件

在 GitHub 上创建 repo:https://github.com//mvn-repo/ 在 pom.xml 中添加 Repository(请注意,完整路径原始文件将与 repo 名称略有不同) < id>project-common Project Common https://github.com//mvn-repo/raw/master/ 添加对主机(Github 或私有服务器)的依赖您只需要知道文件以@glitch /groupId/artifactId/version/artifactId-version.jar b 提到的模式存储。在您的主机上创建文件夹以匹配此模式。即,如果您有一个名为 service-sdk-0.0.1.jar 的 jar 文件,请创建文件夹 service-sdk/service-sdk/0.0.1/ 并将 jar 文件 service-sdk-0.0.1.jar 放入其中。 C。通过尝试从浏览器下载 jar 来测试它(在我们的例子中:https://github.com//mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service- sdk-0.0.1.jar 将依赖项添加到您的 pom.xml 文件中: service-sdk service-sdk 0.0.1 < /依赖>享受


很好,这是我找到的最具扩展性的解决方案,谢谢
N
Nehc

不要使用系统路径。与人们在这里所说的相反,您可以将一个外部 jar 放在您签出的项目目录下的文件夹中,并让 Maven 像其他依赖项一样找到它。这里有两个关键步骤:

将“mvn install:install-file”与 -DlocalRepositoryPath 一起使用。配置存储库以指向 POM 中的该路径。

它相当简单,您可以在此处找到分步示例:http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


c
chendu

如果你遇到同样的问题,并且你使用的是 spring-boot v1.4+,你可以这样做。

有一个 includeSystemScope 可用于将系统范围依赖项添加到 jar 中。

例如

我在我的项目中使用了 oracle 驱动程序。

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

然后让 includeSystemScope=true 将 jar 包含到路径 /BOOT-INF/lib/**

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

并从资源中排除以避免重复包含,jar 足够胖~

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

祝你好运!


我一直在寻找这样的解决方案,仅仅是因为当新开发人员到来时,这会简化安装过程。当您没有工件服务器时,更容易在项目中拥有自定义依赖项。此外,当您使用 CI 时,此解决方案可避免在 CI 服务器上手动安装 jar。
多个罐子怎么样?
<configuration> <includeSystemScope>true</includeSystemScope> </configuration> 这是我认为的主要内容
这对我有用,有一个 jar 库,它在存储库中不可用,但只能在本地 lib 文件夹中使用。此设置解决了我遇到的问题,新机器/开发人员避免了 install:install 问题。
c
craftsmannadeem

将非 maven jar 添加到 maven 项目的 Maven 方式

Maven Project and non maven jars

在构建部分添加 maven 安装插件

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

添加依赖

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

References 请注意,我是该博客的所有者


你怎么知道 jars 和 maven install 插件的版本?
jars 的版本刚刚组成,maven install 插件版本是最新的
我无法解决依赖关系...对于相应的 jar 看起来时机不对它是否真的在尝试解决依赖关系之前安装了 jars?但是我跑了'mvn clean package'
A
Aung Myat Hein

更改您的系统路径。

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

C
Community

pom.xml 将查看您的本地存储库以尝试找到与您的工件匹配的依赖项。此外,您不应该真正使用系统范围或 systemPath 属性,这些通常是为 JDK 而不是 JRE 中的东西保留的

有关如何安装 Maven 工件的信息,请参阅此 question


佚名

请注意,所有使用

<repository>...</respository> 

需要外

<repositories>...</repositories> 

封闭标签。从一些例子中并不清楚。


b
bmargulies

这里最好的解决方案是安装一个存储库:Nexus 或 Artifactory。如果给你一个地方来放置这样的东西,它会通过从外部缓存你的东西来进一步加快速度。

如果您正在处理的事情是开源的,您也可以考虑放入中央。

请参阅the guide


s
senderle

使用 Eclipse Oxygen,您可以执行以下操作:

将您的库放在 WEB-INF/lib 项目中 -> 配置构建路径 -> 添加库 -> Web App 库

Maven 会在安装项目时使用它们。


如果我这样做了,其他拉我项目的用户是否必须在 Eclipse 中做同样的事情?
B
Bug Killer

如果外部 jar 仅由 Maven 项目创建,那么您可以在系统上复制整个项目并运行

mvn install

在项目目录中。这会将 jar 添加到本地 maven 存储库的 .m2 目录中。

现在您可以添加

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

这将确保您

mvn exec:java 

作品。如果您使用 suggested here

<scope>system</scope>

然后,您必须在通过命令行执行时单独添加类。

您可以通过以下命令添加外部 jar described here

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

N
Nitish Kumar

我发现处理此问题的最有效和最干净的方法是使用 Github Packages

无论您是否希望外部 jar 被公开托管,都可以根据您的要求在 GitHub 上创建一个简单的空公共/私有存储库。运行以下 maven 命令以在上面创建的 github 存储库中部署外部 jar mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar - Dfile=路径到文件\-DrepositoryId=id-to-map-on-server-section-of-settings.xml\-Durl=https://maven.pkg.github.com/github-username/github- reponame-created-in-above-step 上面的命令将在 -Durl= 中提到的 GitHub 存储库中部署您的外部 jar。您可以参考此链接如何将依赖项部署为 GitHub Packages GitHub 包部署教程 之后,您可以在 maven pom.xml 中使用上述步骤中提到的 groupId、artifactId 和版本添加依赖项并运行 mvn install Maven 将获取外部的依赖项从 GitHub Packages 注册表中获取 jar 并在您的 maven 项目中提供。为此,您还需要配置 maven 的 settings.xml 以从 GitHub 包注册表中获取。