5

我正在尝试使用 Maven 将以下 db2 jar 添加到我的 Java Web 应用程序中......

db2jcc_license_cu.jar  
db2jcc_javax.jar   
db2jcc.jar

我正在按照这篇文章中发布的说明进行操作...... 我可以在不安装它们的情况下将 jars 添加到 maven 2 build classpath 吗?

我想使用静态项目内存储库解决方案。到目前为止,我已经...

  1. 在我的根目录中创建了一个名为 lib 的文件夹。在这个目录中存在三个 db2 jar。
  2. 将以下内容添加到我的 pom 文件中...
 <repository>
        <id>lib</id>
        <releases>
            <enabled>true</enabled>
            <checksumPolicy>ignore</checksumPolicy>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <url>file://${project.basedir}/lib</url>    
 </repository> 
 </repositories>
<dependency> 
    <groupId>com.ibm.db2.jcc</groupId>
    <artifactId>db2jcc</artifactId>
    <version>3.8.47</version>
</dependency>
<dependency>
    <groupId>com.ibm.db2.jcc</groupId>
    <artifactId>db2jcc_license_cu</artifactId>
    <version>3.8.47</version>
</dependency>

但是当我运行 maven 安装时,我得到...

[WARNING] The POM for com.ibm.db2.jcc:db2jcc:jar:3.8.47 is missing, no dependency information available
[WARNING] The POM for com.ibm.db2.jcc:db2jcc_license_cu:jar:3.8.47 is missing, no dependency information available

我通过运行一个...得到了罐子的版本。

java com.ibm.db2.jcc.DB2Jcc -version

我是否正确指定了此版本信息?谁能建议我做错了什么?

4

3 回答 3

10

问题是您没有在“project-maven-repository”中正确安装 jars(即在文件夹中${project.basedir}/lib

mvn installMaven 将jar 文件(当您这样做时)存储在 Maven 存储库中。Maven 存储库具有精确的层次结构。这是该结构的简化图:

  • 工件groupId+artifactId定义存储工件的文件夹路径的第一部分(在存储库中)。
  • 工件version是文件夹路径的第二部分
  • 工件version也是工件名称的后缀
  • artifactId是工件名称
  • 包装是工件扩展(默认是jar)

默认情况下,maven 使用位于下的存储库<USER_HOME>/.m2/repository

您尝试设置的解决方案使用存储库的另一个位置:${project.basedir}/lib即使它不是默认存储库位置,它仍然是maven-repository,因此 maven 期望在此位置下找到通常的 maven 存储库层次结构。

这就是为什么您需要${project.basedir}/lib像 Maven 存储库一样组织您的文件夹。这在参考帖子的这一部分中进行了解释:

使用 Maven 安装到项目 repo

我建议不要手动创建此结构,而是使用 Maven 插件将您的 jar 安装为工件。因此,要将工件安装到 repo 文件夹下的项目内存储库中,请执行:

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

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

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

所以你需要做一个mvn install来创建${project.basedir}/lib层次结构(你可以手工做,但不推荐这样做并且容易出错)。

在您的情况下,要运行的命令将是这样的:(假设您将 jar 放入 HOME_DIR 并在您的 HOME_DIR 中运行此命令${project.basedir}

mvn install:install-file -DlocalRepositoryPath=lib -DcreateChecksum=true -Dpackaging=jar -Dfile=<USER_HOME>/db2jcc_license_cu.jar -DgroupId=com.ibm.db2.jcc -DartifactId=db2jcc_license_cu -Dversion=3.8.47

您选择的方法有哪些优势:

  • 没有 maven 设置的开发人员将在 SCM 系统下的项目源中拥有可用的库。
  • 您可以轻松引用不在公共 maven 存储库中的 jar,而无需诸如artifactorynexus之类的东西

缺点:

  • ${project.basedir}/lib对于不习惯使用 maven 的人来说,一个非常复杂的文件夹结构看起来很奇怪。
  • 您将在 SCM 下存储库(大量的巨大二进制文件)
于 2013-03-14T01:15:00.837 回答
2

另一种解决方案是事先下载这些 jar 并将它们放在相对于您的项目的某个位置(如lib目录)。现在只需告诉 maven 使用这些罐子。这里的groupIdartifactdIdversionJFYI,因为它们不会用于下载任何内容。

此解决方案的优点是您不必构建 Maven 存储库。

<dependencies>
    ...      
    <dependency>
        <groupId>com.ibm.db2.jcc</groupId>
        <artifactId>licences</artifactId>
        <version>1.0</version> <!-- Adjust this properly -->
        <scope>system</scope>
        <systemPath>${basedir}/lib/db2jcc_license_cu.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>com.ibm.db2.jcc</groupId>
        <artifactId>db2jcc4</artifactId>
        <version>1.0</version> <!-- Adjust this properly -->
        <scope>system</scope>
        <systemPath>${basedir}/lib/db2jcc4.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>com.ibm.db2.jcc</groupId>
        <artifactId>db2jcc_javax</artifactId>
        <version>1.0</version> <!-- Adjust this properly -->
        <scope>system</scope>
        <systemPath>${basedir}/lib/db2jcc_javax.jar</systemPath>
    </dependency>
</dependencies>

参考链接(日文):Mavenリポジトリで提供されていないサードパーティJarをどうするか

于 2016-08-22T07:23:20.963 回答
1

我猜这些罐子没有 pom.xml。因此发出警告。如果罐子被打包并且应用程序可以工作,那么我想你没有问题。

于 2013-03-13T12:41:26.243 回答