是否有正确的方法来导入具有特定命名和类路径要求的依赖项?

时间:2013-08-31 23:23:16

标签: java maven

我正在开发一个依赖于第三方库的项目,打包为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内容添加到类路径中,这种类路径也将被视为具有传递依赖性。 如果这个解决方案可行,那么最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

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

假设您的jar名称是“specialLib.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>