包含本地jar到maven项目后的ClassNotFoundException

时间:2016-03-09 06:55:28

标签: java spring maven

我有一个基于maven的春季启动项目。

我必须包含另一个团队提供的本地jar。所以我按照接受的答案:How to include local jar files in Maven project

所以我用:

<dependency>
  <groupId>com.netease</groupId>
  <artifactId>thrift</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/lib/prome-thrift-client-1.0.0.jar</systemPath>
</dependency>

在IDEA工作正常。但是当我试图用:

运行包jar时
  mvn clean package
  java -jar target/prome-data.jar

Stacktrace就像:

....
....
Caused by: java.lang.ClassNotFoundException: com.netease.thrift.client.ThriftRpcClient

我有什么遗漏

4 个答案:

答案 0 :(得分:3)

我今天遇到了类似的问题,并且让我停留半天来解决它。

对于大多数情况,使用以下内容可以进行开发。

<dependency>
    <groupId>com.netease</groupId>
    <artifactId>thrift</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/prome-thrift-client-1.0.0.jar</systemPath>
</dependency>

如果你把jar放到正确的路径上,那么可以在 IDEA Eclipse 中运行。

将jar部署到服务器或在本地运行jar后,它可能会抛出ClassNotFoundException

如果您使用的是spring-boot,则仍然需要以下插件:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
            <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

运行mvn clean package后,您可以在/BOOT_INF/lib下找到该jar。

之间,如果你的软件包 war ,那么你仍然需要这个插件:

 <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                        <directory>lib</directory>
                        <targetPath>BOOT-INF/lib/</targetPath>
                        <!-- <targetPath>WEB_INF/lib/</targetPath> just for none spring-boot project -->
                        <includes>
                            <include>**/*.jar</include>
                        </includes>
                </resource>
            </webResources>
        </configuration>
 </plugin>

-----------------另一种方式--------------------

您可以使用此插件替换maven-war-plugin

 <plugin>  
      <artifactId>maven-compiler-plugin</artifactId>  
       <configuration>  
            <source>1.8</source>  
            <target>1.8</target>  
            <compilerArguments>  
                <extdirs>${project.basedir}/lib</extdirs>  
            </compilerArguments>  
      </configuration>  
</plugin>  

添加资源:

<resources>  
    <resource>  
        <directory>lib</directory>  
        <targetPath>BOOT-INF/lib/</targetPath>  
        <includes>  
            <include>**/*.jar</include>  
        </includes>  
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <targetPath>BOOT-INF/classes/</targetPath>
    </resource> 
</resources>

答案 1 :(得分:2)

在我看来,当您尝试运行jar时,您没有为此运行指定类路径,因此缺少所需的.jar文件。

使用Maven插件捆绑jar中的依赖项,这将生成包含所有依赖项的jar。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>cz.gisat.eoapps.viz.Main</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

或确保.jar文件中的清单存在并包含所有其他jar的类路径。

答案 2 :(得分:1)

mvn clean package不会将依赖项jar包装到目标jar中。在运行-classpath时,您应该将java -jar target/prome-data.jar设置为指向所有依赖关系jar。

答案 3 :(得分:0)

您的问题是系统范围不适用于程序集插件,Spring Boot使用它来构建&#34;全部包含的&#34;广口瓶中。

如果您希望您的第三方库包含在&#34;全包含&#34;由spring boot插件构建的jar然后你应该依赖于&#34; maven方式&#34;通过存储库。

如果您不想为该lib创建/维护一个真正完整的存储库(在小项目/少量第三方库中可以理解),那么首选解决方案是将它们存储在与本地相关的项目中库。该存储库(基本上是一个非常静态的目录结构)甚至可以提交给源代码控制。

以下是Pascal Thivent的一个很好的例子:

Maven: add a dependency to a jar by relative path

我刚刚对maven 3.3进行了检查,它确实有效。工作示例:

http://peter.risko.hu/java_incubator/spring_boot_with_3rd_party_lib_in_project_relative_local_repo.zip

另请注意,Spring Boot隐藏了创建&#34;所有包含&#34;的复杂性。罐。所以你不应该在这里手动使用程序集插件。