3

アプリケーションを実行可能な jar としてパッケージ化する必要があります。そのプロパティ ファイルは、その外部の同じディレクトリに配置されます。最後に、ファイルシステムに次のようなものがあります。

.
 app.jar
 file1.properties
 file2.properties

ただし、パッケージ化した後、アプリケーションはプロパティ ファイルにアクセスできません。いくつかの調査の結果、何が原因であるかはわかっていると思いますが、Maven に希望どおりに実行するように指示することはできません。

以下に示すように、maven-assembly-plugin を使用して依存関係のある jar を構築しています。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <index>false</index>                
            <manifest>
                <mainClass>main.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path> 
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

jar を実行しようとすると、jar ファイル外のプロパティが読み込まれていないことを示す例外が発生します。

main.Main クラスに、jar の外部からのアクセス可能性をテストするためだけに、次のコードを追加しました。

ClassLoader cl = ClassLoader.getSystemClassLoader();
URL systemResource = ClassLoader.getSystemResource("file1.properties");
System.out.println("File 1 " + systemResource);
systemResource = ClassLoader.getSystemResource("insideJarFile.xml");
System.out.println("insideJarFile.xml " + systemResource);

insideJarFile.xmljar 内にパッケージ化されたファイルです。上記のコードの結果は次のとおりです。

File 1 null
insideJarFile.xml jar:file:/D:/test/application-jar-with-dependencies.jar!/insideJarFile.xml

数時間調査した結果、原因は INDEX.LIST ファイルにある可能性があることがわかりました。jarファイルを7-zipで開いたところ、META-INFフォルダー内に見つかりました。jar 内から削除し、再度実行しました。結果は次のとおりです。

File 1 file:/D:/test/file1.properties
insideJarFile.xml jar:file:/D:/test/application-jar-with-dependencies.jar!/insideJarFile.xml

質問: INDEX.LIST ファイルを作成しないように maven に指示するにはどうすればよいですか? 試してみ<index>false</index>ましたが、うまくいきませんでした。

ティア、

FQL

4

2 に答える 2

1

もう 1 つの回避策は、jar の作成後に Index.List ファイルを削除することです。これは、 TrueZIP Maven Pluginを使用して実行できます。この方法では、maven-assembly-plugin を切り替える必要はありません。

以下の例は、 hereから取得および適応されています。pom.xml 内の maven-assembly-plugin の後にスニペットを挿入するだけです。

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>truezip-maven-plugin</artifactId>
<version>1.1</version>
<executions>
    <execution>
        <id>remove-a-file-in-sub-archive</id>
        <goals>
            <goal>remove</goal>
        </goals>
        <phase>package</phase>
        <configuration>
            <fileset>
                <directory>target/my-jar.jar/META-INF</directory>
                <includes>
                    <include>INDEX.LIST</include>
                </includes>
            </fileset>
        </configuration>
    </execution>
</executions>

于 2015-04-17T12:36:50.220 に答える
1

maven-assembly-plugin の使用をあきらめました。

代わりに、André Aronsen のソリューションを使用し、次のコードのみを追加しました。

<manifestEntries>
    <Class-Path>.</Class-Path>
</manifestEntries>

jar の現在のディレクトリをクラスパスに挿入するためにそれを行ったので、必要に応じてプロパティ ファイルをその外部に置くことができます。

将来の読者のために、最終的なコードを次に示します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>theMainClass</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin> 

このように、多くの問題を心配する必要はありません。同時に、André Aronsen のソリューションは非常に単純ですが、すべての依存関係を内部に含む jar を作成するわけではありません。

読んでくれてありがとう、André Aronsen の称賛、そしてこれが他の人にも役立つことを願っています。

于 2013-05-08T16:31:17.593 に答える