这是我学习 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 ?
谢谢!
您可以创建 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 install:install-file
用库 jar 填充您的本地存储库,然后您应该将范围从系统更改为编译。
如果您从 maven 开始,我建议直接使用 maven 而不是 IDE 插件,因为它增加了额外的复杂性。
至于错误,您是否将所需的 jars 放在类路径中?如果您使用库中的类型,则还需要在运行时访问它。这与maven本身无关。
我不明白您为什么要将库置于源代码管理中 - 它用于源代码而不是二进制 jar。
mvn install::install-file
的更多信息:mkyong.com/maven/…
mvn install::install-file
意味着任何克隆您的源代码的人也必须执行此手动步骤。否则,构建是开箱即用的
这可以通过使用嵌套在
例如:
<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
install
目标。 Ofc 有一个气隙系统并拥有除安装插件之外的所有插件,这是非常罕见的情况。
"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
Maven 手册says to do:
mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar
更新我们刚刚安装了我们自己的 Nexus 服务器,更容易和更清洁。
在我们公司,我们有一些罐子,有些罐子很常见,但没有托管在任何 maven 存储库中,我们也不希望将它们放在本地存储中。我们在 Github 上创建了一个非常简单的 mvn(公共)存储库(但您可以将它托管在任何服务器上或本地):请注意,这仅适用于管理一些很少更改的 jar 文件
在 GitHub 上创建 repo:https://github.com/
不要使用系统路径。与人们在这里所说的相反,您可以将一个外部 jar 放在您签出的项目目录下的文件夹中,并让 Maven 像其他依赖项一样找到它。这里有两个关键步骤:
将“mvn install:install-file”与 -DlocalRepositoryPath 一起使用。配置存储库以指向 POM 中的该路径。
它相当简单,您可以在此处找到分步示例:http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html
如果你遇到同样的问题,并且你使用的是 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>
祝你好运!
<configuration> <includeSystemScope>true</includeSystemScope> </configuration>
这是我认为的主要内容
将非 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 请注意,我是该博客的所有者
更改您的系统路径。
<dependency>
<groupId>stuff</groupId>
<artifactId>library</artifactId>
<version>1.0</version>
<systemPath>${project.basedir}/MyLibrary.jar</systemPath>
<scope>system</scope>
</dependency>
pom.xml 将查看您的本地存储库以尝试找到与您的工件匹配的依赖项。此外,您不应该真正使用系统范围或 systemPath 属性,这些通常是为 JDK 而不是 JRE 中的东西保留的
有关如何安装 Maven 工件的信息,请参阅此 question。
请注意,所有使用
<repository>...</respository>
需要外
<repositories>...</repositories>
封闭标签。从一些例子中并不清楚。
这里最好的解决方案是安装一个存储库:Nexus 或 Artifactory。如果给你一个地方来放置这样的东西,它会通过从外部缓存你的东西来进一步加快速度。
如果您正在处理的事情是开源的,您也可以考虑放入中央。
请参阅the guide。
使用 Eclipse Oxygen,您可以执行以下操作:
将您的库放在 WEB-INF/lib 项目中 -> 配置构建路径 -> 添加库 -> Web App 库
Maven 会在安装项目时使用它们。
如果外部 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>
我发现处理此问题的最有效和最干净的方法是使用 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 包注册表中获取。
mvn install:install-file
,然后将整个目录结构从本地存储库复制到项目内存储库。/groupId/artifactId/version/artifactId-verion.jar
时,不要将包名用作groupId
的错误;相反,它应该在文件夹树中划分。例如,对于 groupIdorg.json
,路径应该看起来像org/json/2.0/json-2.0.jar
,而不是org.json/2.0/json-2.0.jar