2011-01-14 10 views
16

OS名: "Linuxの" バージョン: "2.6.32-27-一般的な" アーチ: "I386" ファミリー: "UNIX"Mavenは依存関係のためにクラスパスを設定しない正しく

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

Javaバージョン:1.6.0_20

私はUbuntuの中のmavenでMySQLの依存関係を使用しようとしています。 mavenが$ JAVA_HOME/jre/lib/ext /フォルダにダウンロードした "mysql-connector-java-5.1.14.jar"ファイルを移動すると、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パッケージは、」何の問題もなく、それを構築し、私はそれを実行することができますが、アプリケーションは、データベースにアクセスするには、このエラーをしようとしたとき提示された:

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"); 

できる任意のは、私が間違ってやっていることや解決する方法を教えてください。

答えて

17

Raghuramを参照してください私に正しい方向にプッシュを与えました。自動的にjarファイルをコピーするの世話をするためにMavenを取得する方法は、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

jarファイルを一緒にパッケージ化するのはうれしいことですが、これはこの質問に答えるのに十分です。 stackoverflowの上の関連解答:

Building executable jar with maven?

How can I create an executable JAR with dependencies using Maven?

+0

+1は、maven-assembly-pluginへのリンクです。別のものがあります:http://maven.apache.org/plugins/maven-assembly-plugin/usage.html –

2

Mavenはクラスパスを依存関係に正しく設定しますが、プレフィックスにはリポジトリの場所はありません。 Manifestファイルでは次のようになります。

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

実行中のjarファイルと同じフォルダに依存するjarファイルを配置することをお勧めします。

the examples

+0

ありがとう、これは私にもっと近いです。私はdependency:copy-dependenciesの目標をpom.xmlファイルに追加して、依存関係を自動的にコピーするようにmavenを設定することができました。 – Matthew

12

私はこの質問が古いですけど、それはMavenのは-snapshotバージョンで適切に依存関係を設定するために取得するための検索の上部に現れると私が持っていました受け入れられた解決策を洗練して、クラスパス解決が正しく機能するようにします。

私が遭遇した問題は、maven-dependency-plugin(バージョン2.5.1以降)がbaseVersionを保持している依存関係をコピーしている間に、依存関係のresolvedVersion(例えば - .jar) --SNAPSHOT.jar)。 (その強化の詳細については、https://jira.codehaus.org/browse/MDEP-380を参照してください。)

物事が働いて得るために、私は次のように、この動作をオフにする必要がありました:

... 
    <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> 
    ... 

この構成では、依存関係が彼らのresolvedVersionマッチングと$ {project.build.directory} /依存関係にコピーされる原因blasspathはmaven-jar-pluginによってMETA-INF/MANIFEST.MFに設定されます。うまくいけば、これは将来誰かを助けてくれるでしょう。

+1

バグトラッカーによると、この問題はバージョン2.6から修正されています。 –

関連する問題