【问题标题】:Maven: generated jar file encounter classNotFound errorMaven:生成的jar文件遇到classNotFound错误
【发布时间】:2017-07-11 00:20:20
【问题描述】:

我一直在努力使用 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,它工作正常。

【问题讨论】:

  • 假设jar文件打包时不包含com.microsoft.sqlserver.jdbc.SQLServerDriver。您需要将sqlserver.jdbc jar 文件放到.m2 并重新打包jar 文件,因为maven 首先从本地存储库中获取jar 文件。
  • 您也可以为自己的问题创建一个答案并接受它。

标签: java maven jar build classnotfoundexception


【解决方案1】:

以前我认为让它工作的是执行以下命令,在这种情况下,我认为我手动将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 的建议找到它。

【讨论】:

  • -cp 在使用 -jar 时不起作用。使用-jar 时,必须在 jar 文件的清单中定义类路径。
  • 请在您的答案中添加解释。
猜你喜欢
  • 2017-09-18
  • 2021-08-02
  • 2018-10-14
  • 2018-01-31
  • 2017-10-04
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多