0

今天我在 maven-assembly-plugin 的帮助下将我的 maven projekt 编译为可执行 jar。但是在这样做之后,我的 jar 文件无法解析路径。

我将此添加到我的 pom.xml

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
    <execution>
        <id>package-jar-with-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>single</goal>
        </goals>
        <configuration>
            <appendAssemblyId>false</appendAssemblyId>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>de.main.Main</mainClass>
                </manifest>
            </archive>
        </configuration>
    </execution>
</executions>
</plugin>

这个项目依赖于另一个项目。我在 pom.xml 中设置了依赖项。而这个依赖项目现在无法找到他的资源。资源的路径是 /src/main/resources/Lang。执行 maven-install 后,此文件夹已移至 /classes/Lang。我的依赖项目现在无法找到这条路径。

我怎么解决这个问题?

4

3 回答 3

1

里面的东西在src/main/resources类路径上,应该通过类加载器作为资源访问 - 而不是作为位于文件系统中的文件。试想一下,当在 jar 文件中传递时,您将如何访问这样的资源?

如果您需要文件存在于围绕各种 jar 文件的文件系统中,则必须使用另一种机制。

于 2012-12-23T10:56:34.777 回答
1

正如我所怀疑的那样,问题在于您没有正确加载资源。您正在使用 File IO 访问不是文件的资源,而是类路径中的 jar 文件的条目。想一想:一旦您将 jar 提供给应用程序的最终用户(或使用您的库的开发人员),他的计算机上将不会有任何 src/main/resources/Lang。src/main/resources是文件在您的开发环境中的位置。

要加载位于运行时类路径中 jar 根目录的 Lang 文件的内容,请使用

InputStream in = SomeClass.class.getResourceAsStream("/Lang");

或者

InputStream in = getClass().getClassLoader().getResourceAsStream("Lang");

注意:要查看 jar 文件的内容,请使用任何 zip 工具打开它,或使用命令

jar -tf theFile.jar
于 2012-12-23T11:10:38.377 回答
0

在您的程序集 xml 中,您需要使用依赖项集:

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>my-assembly</id>

...

<dependencySets>
   <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
   <includes>
    <include>groupId:artifactId</include>
   </includes>
   </dependencySet>
</dependencySets>

请参阅Maven 程序集插件

于 2012-12-23T09:56:25.777 回答