4

我正在开发一个依赖于第三方库的项目,该库打包为 JAR,其中包含一些非 Java 资源。我无权访问它的源,但显然库获取其中某些资源的方式是通过指定相对于该库的 JAR 的 URI。换句话说:代码仅在库 jar 具有特定名称时才有效。

这让我很头疼,因为我使用 Maven 来构建我的项目。通常我在我的本地存储库中安装第三方库并将它们作为依赖项导入到我的 POM 中,我不在乎依赖库中的 jar 的名称是否被 Maven 更改(通常在名称中添加一个版本)。

解决这个问题的正确方法是什么?我有直觉,我应该以某种方式导入具有预期名称的第三方库,并以某种方式将导入库 jar 的父目录添加到类路径中(因此可以在运行时根据其名称找到该 jar)。这个对吗 ?如果是这样,我怎么能做到这一点?

更复杂的是,我正在开发的项目本身也是一个库,因此它也应该由其他项目使用 Maven 导入。例如,首先我考虑将库声明为已提供,然后将其复制到项目目录中的文件(具有所需名称)中,如下所示:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.7</version>

            <executions>
                <execution>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>theGroup</groupId>
                                <artifactId>theArtifact</artifactId>
                                <version>theVersion</version>
                                <type>jar</type>
                                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                <destFileName>EXPECTED_NAME.jar</destFileName>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

但这不起作用,因为在将我的库导入另一个项目时,复制的文件不被视为传递依赖项。

更新:

我想可能可行的方法是在资源文件夹中找到第三方 jar(使用预期的名称),然后以某种方式将 jar 内容添加到类路径中,这样类路径也将被视为具有传递依赖项。如果此解决方案可能有效,那么最简单的方法是什么?

4

1 回答 1

0

您可以将该 jar 复制到您的项目的文件夹中,并添加具有系统范围的依赖项。

假设您的 jar 名称是“particularLib.jar”。您可以在主项目下创建一个名为 external-libs 的文件夹并将 jar 复制到其中。您可以通过这种方式声明依赖项:

<dependency>
    <groupId>particular</groupId>
    <artifactId>particularLib</artifactId>
    <version>1</version>
    <scope>system</scope>
    <systemPath>${basedir}/external-libs/partucularLib.jar</systemPath>
</dependency>
于 2013-09-12T16:56:06.640 回答