Maven:生成的jar文件遇到classNotFound错误

时间:2017-07-11 00:20:21

标签: java maven jar build classnotfoundexception

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

但是在使用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,但它确实有效。

1 个答案:

答案 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,程序运行的原因是我还在我的sqljdbc4.jar存储库中手动添加了.m2依赖项

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

所以程序就像@Rajith Pemabandu建议的那样。