maven - 在打包的 jar 中找不到引用的库 [重复]

Posted

技术标签:

【中文标题】maven - 在打包的 jar 中找不到引用的库 [重复]【英文标题】:maven - referenced libraries not found in packaged jar [duplicate] 【发布时间】:2018-10-04 13:54:52 【问题描述】:

当我mvn clean package 项目并使用java -jar target/project.jar 运行它时,它会抛出一个错误,它无法从外部 jar 中找到某些类。

采取的步骤

    所有外部 jar 都在我项目的文件夹中:/jars/jars/morejars/

    将 jars 添加到构建路径:在 Eclipse 中,我右键单击 project,转到 build path 并选择 add external archives。我可以看到 Eclipse 在“Maven 依赖项”文件夹下创建了一个库文件夹“引用的库”。当我检查project -> Properties -> Java Build Path -> Libraries 时,我可以看到所有导入的罐子。

其中一些外部 jar 在pom.xml 中被描述为<dependency>(带有<systemPath),因此它们不会出现在Referenced Libraries 中,而是出现在Maven dependencies 中(有趣的是,当运行我打包的项目是在一个外部 jar 中,它不在 Referenced Libraries 中,而是在 Maven dependencies)

例如

       <dependency>
            <groupId>external.jar.groupid</groupId>
            <artifactId>external.jar.artifactid</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>$basedir/jars/external-jar.jar</systemPath>
        </dependency>

    使用 maven 程序集插件(如 here 所述),这是我的完整 &lt;build&gt; 配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                  <execution>
                    <phase>package</phase>
                    <goals>
                      <goal>single</goal>
                    </goals>
                  </execution>
                </executions>
                <configuration>
                  <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
                </configuration>
              </plugin>
        </plugins>
    </build>
    

    运行mvn clean package -> BUILD SUCCESS

    java -jar target/project.jar -> 无法从external.jar 找到some.class

感谢您的帮助

【问题讨论】:

您使用system 作用域依赖项是否有特定原因? “..它们通常用于告诉 Maven JDK 或 VM 提供的依赖项..” 我还猜想系统范围可能是根本原因,因为它很有用,例如。当您有一些共享库时,例如。在应用程序服务器 libs 文件夹等中。但不适用于独立应用程序 - 检查 maven doc Dependencies with the scope system are always available and are not looked up in repository. They are usually used to tell Maven about dependencies which are provided by the JDK or the VM. 所以在包目标期间,它们不会被下载/添加到您的包中 【参考方案1】:

问题显然在于依赖关系。当您的应用程序开始加载时,它会寻找所需的类以正常运行。虽然它从 jar 库加载一个类,并且该库类还引用另一个 jar 库文件中的某个其他类,但该库(jar 文件)在您的类路径中不可用,但它会给您上述错误。因此,检查 maven 依赖项并获取应用程序所需的所有 jar。同样基于错误消息,您还可以在 pom.xml 文件中添加 jar 引用。例如,如果您收到 Failed to load com.apache.some.Example.class 之类的错误,只需 google 示例.class jar 文件并从 maven 存储库中获取它。

希望这会对你有所帮助。

【讨论】:

谢谢,但不是公认的答案,因为该 jar 在任何关系上尚不可用

以上是关于maven - 在打包的 jar 中找不到引用的库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Maven:包括在公共存储库中找不到的 jar

maven项目引用外部jar

maven项目或者SpringBoot项目启动时报错在本地仓库中找不到jar包的解决办法

在 jboss-public-repository-group 中找不到工件 > org.apache.maven.plugins:maven-compiler-plugin:jar:3.5.1

maven 得到引用类源代码,命令

用maven打包jar项目其中很多模块引用了相同jar包,如何把它些jar公用,让maven打包不把这公用包打进去