1. ホーム
  2. java

[解決済み] Mavenで最終的なJARファイル内のライブラリフォルダに必要なすべてのJARファイルを配置するにはどうすればよいですか?

2022-09-06 20:42:55

質問

私はスタンドアロンアプリケーションでMavenを使用しており、ここの回答の1つに記載されているように、私のJARファイルのすべての依存関係をライブラリフォルダ内にパッケージ化したいと考えています。

Mavenを使用して依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?

最終的なJARファイルには、JARファイルとして依存関係を含むライブラリフォルダを持たせたいのですが、これは maven-shade-plugin のように、.m2フォルダー内のMaven階層のようなフォルダー形式で依存関係を配置するものではありません。

さて、実際には、現在の構成は私が望むものを行いますが、アプリケーションを実行するときにJARファイルをロードすることに問題があります。クラスを読み込むことができません。

以下は私の設定です。

<plugins>

    <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}/classes/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>com.myapp.MainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>install</id>
                <phase>install</phase>
                <goals>
                    <goal>sources</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>

</plugins>

プロジェクトはEclipseから正常に実行され、JARファイルは私が望むように最終的なJARファイル内のライブラリフォルダに置かれますが、最終的なJARファイルをターゲットフォルダから実行すると、常に次のようになります。 ClassNotFoundException :

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.

この例外を修正するにはどうすればよいですか?

どのように解決するのですか?

このリンクをクリックします。

ハウツー:EclipseのMavenは、依存関係を持つビルドjarをインストールする

クラスローダーはjarの中からjarをロードしないので、これは実行可能な解決策ではないことがわかりましたので、私はjarの中に依存関係を解凍すると思います。