2017-07-11 58 views
0

我一直在努力用Maven生成一个可执行的jar文件。我包含一个单独的sqljdbc.jar文件并将它放在一个/lib文件夹中,该项目无错误且可在Eclipse或IntelliJ中运行。Maven:生成的jar文件遇到classNotFound错误

但是使用Maven的时候,我产生了jar文件有:

mvn clean package 

,并用下面的代码运行它:

java -jar target/etl-aggregation-0.0.1-SNAPSHOT.jar 

,并得到了以下消息:

ClassNotFoundException e : java.lang.ClassNotFoundException: 
com.microsoft.sqlserver.jdbc.SQLServerDriver null 

我曾尝试过几种方法,如How can I create an executable JAR with dependencies using Maven?,但仍然不能解决问题。

这是我pom.xml文件的生成部分:

<build> 
    <resources> 
     <resource> 
      <directory>${project.basedir}</directory> 
      <includes> 
       <include>lib/*.jar</include> 
      </includes> 
     </resource> 
    </resources> 
    <plugins> 
     <!-- download source code in Eclipse, best practice and i don't know its usage here..--> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <version>2.9</version> 
      <configuration> 
       <downloadSources>true</downloadSources> 
       <downloadJavadocs>false</downloadJavadocs> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
     </plugin> 

     <!-- Set a compiler level --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
         <mainClass>com.etl_aggregation.app.App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

     <!-- Maven Assembly Plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.4.1</version> 
      <configuration> 
       <!-- get all project dependencies --> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <!-- MainClass in mainfest make a executable jar --> 
       <archive> 
        <manifest> 
         <mainClass>com.etl_aggregation.app.App</mainClass> 
        </manifest> 
       </archive> 

      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <!-- bind to the packaging phase --> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

问题解决

我手动添加-cp lib/sqljdbc4.jar运行jar和它的工作。

+0

假设打包的jar文件不包含'com.microsoft.sqlserver.jdbc.SQLServerDriver'。您需要将'sqlserver.jdbc' jar文件放到'.m2'中,并重新打包jar文件,因为maven首先从本地存储库获取jar文件。 –

+0

您也可以为自己的问题创建一个答案并接受它。 –

回答

0

以前我以为,使其工作是执行下面的命令,其中,在这种情况下,我想我加入了sqljdbc4.jar依赖于手工类路径...

java -cp lib/sqljdbc4.jar -jar target/etl-aggregation-0.0.1-SNAPSHOT.jar

但实际上发生了什么事是Run a JAR file from the command line and specify classpath和原因,程序运行是,我也是手动添加在我.m2库中的sqljdbc4.jar依赖

mvn install:install-file -Dfile=lib/sqljdbc4.jar -DgroupId=com.microsoft.sqlserver \ 
    -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar 

使程序刚刚发现它为@Rajith Pemabandu建议。

+0

使用'-jar'时'-cp'不起作用。当使用'-jar'时,类路径必须在jar文件的清单中定义。 –

+1

请将解释添加到您的答案中。 –

+0

@MarkRotteveel是的,你是对的... –