web-dev-qa-db-ja.com

Mavenが依存関係のクラスパスを正しく設定しない

OS名:「linux」バージョン:「2.6.32-27-generic」アーチ:「i386」ファミリー:「unix」

Apache Maven 2.2.1(r801777; 2009-08-06 12:16:01-0700)

Javaバージョン:1.6.0_20

私はubuntuのmavenでmysql依存関係を使用しようとしています。 mavenでダウンロードした「mysql-connector-Java-5.1.14.jar」ファイルを$ Java_HOME/jre/lib/ext /フォルダーに移動すると、jarを実行したときにすべて問題ありません。

Pom.xmlファイルで依存関係を指定するだけで、mavenが依存関係jarのクラスパスを自動的に設定するようにすべきだと思います。これは間違っていますか?

私のpom.xmlファイルは次のようになります。

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.ion.common</groupId>
  <artifactId>TestPreparation</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>TestPrep</name>
  <url>http://maven.Apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>

        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.ion.common.App</mainClass>
            </manifest>
          </archive>
        </configuration>

      </plugin>
    </plugins>
  </build>

  <dependencies>

    <!-- JUnit testing dependency -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- MySQL database driver -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-Java</artifactId>
      <version>5.1.14</version>
      <scope>compile</scope>
    </dependency>

  </dependencies>
</project>

コマンド「mvn package」は問題なくビルドされ、実行できますが、アプリケーションがデータベースにアクセスしようとすると、次のエラーが表示されます。

Java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at Java.net.URLClassLoader$1.run(URLClassLoader.Java:217)
        at Java.security.AccessController.doPrivileged(Native Method)
        at Java.net.URLClassLoader.findClass(URLClassLoader.Java:205)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:321)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:294)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:266)
        at Java.lang.Class.forName0(Native Method)
        at Java.lang.Class.forName(Class.Java:186)
        at com.ion.common.Functions.databases(Functions.Java:107)
        at com.ion.common.App.main(App.Java:31)

失敗している行は次のとおりです。

Class.forName("com.mysql.jdbc.Driver");

誰かが私が間違っていることやそれを修正する方法を教えてもらえますか?

19
Matthew

ラグラムは私に正しい方向へのプッシュを与えました。 Mavenにjarの自動コピーを処理させる方法は、pom.xmlファイルのタグ内にこのコードを追加することです。

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

これに関する詳細はここにあります: https://maven.Apache.org/plugins/maven-dependency-plugin/usage.html

Mavenがjarを一緒にパッケージ化することは素晴らしいことですが、これはこの質問に答えるのに十分です。 stackoverflowに関連する回答:

mavenで実行可能なjarをビルドしていますか?

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

19
Matthew

私はこの質問が古いことを知っていますが、Mavenに-SNAPSHOTバージョンで依存関係を適切に設定させるための検索の上部に表示され、クラスパス解決を正しく機能させるために、受け入れられたソリューションを調整する必要がありました。

私が遭遇した問題は、maven-jar-pluginに依存関係の解決済みバージョン(たとえば、-jar)が含まれているのに対し、maven-dependency-plugin(バージョン2.5.1以降)は、baseVersion --SNAPSHOTを維持しながら依存関係をコピーすることです。 jar)。 (その拡張機能の詳細については、 https://jira.codehaus.org/browse/MDEP-38 を参照してください。)

物事を機能させるには、この動作を次のようにオフにする必要がありました。

    ...
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>dependency/</classpathPrefix>
                        <mainClass>com.example.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <useBaseVersion>false</useBaseVersion>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
    ...

この構成により、依存関係が${project.build.directory}/dependencyにコピーされ、そのresolvedVersionは、maven-jar-pluginによってMETA-INF/MANIFEST.MFに設定されているブラスパスと一致します。うまくいけば、これは将来の誰かを助けるでしょう。

13
Maelstrom

Mavenは依存関係へのクラスパスを正しく設定しますが、リポジトリーの場所の接頭辞は付きません。 Manifestファイルでは次のようになります。

Class-Path: mysql-connector-Java-5.1.14.jar

依存しているjarを、実行しているjarと同じフォルダーに配置するのはユーザーの責任です。

例を参照してください

2
Raghuram

または、maven-shade-pluginを使用している場合の回避策は、不足しているファイルを含めるためのフィルターを追加することです。

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    ...
                    <configuration>
                        ...
                        <filters>
                            ...                                
                            <filter>
                                <artifact>com.Sun.istack</artifact>
                                <includes>
                                    <include>**</include>
                                </includes>
                            </filter>
0
kellogs