我有一个基于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
我有什么遗漏
答案 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进行了检查,它确实有效。工作示例:
另请注意,Spring Boot隐藏了创建&#34;所有包含&#34;的复杂性。罐。所以你不应该在这里手动使用程序集插件。