美文网首页
maven从没有属性清单说起

maven从没有属性清单说起

作者: DizzyDwarf | 来源:发表于2019-04-06 14:41 被阅读0次

使用maven构建的jar包在命令行用java -jar运行会提示"没有属性清单"

没有属性清单

为了让maven生成的jar包的manifest文件中加入Main-Class,可以给maven-jar-plugin增加如下配置

<configuration>
    <archive>
        <manifest>
            <mainClass>yourpackagename.yourclassname</mainClass>
        </manifest>
    </archive>
</configuration>

再次运行程序,提示java.lang.NoClassDefFoundError,显然是缺少依赖的第三方jar包

缺少依赖的jar包

再次查资料,似乎需要增加addClasspathclasspathPrefix,于是之前的配置变成了现在这样

<configuration>
    <archive>
        <manifest>
            <mainClass>com.dizzydwarf.testaop.App</mainClass>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
        </manifest>
    </archive>
</configuration>

检查生成jar包中的manifest,Class-Path中增加了依赖的jar包,并且jar包的路径被指定为lib目录。问题在于因为依赖都是通过maven下载到本地仓库,当前的classpath中不存在这些jar包,更不存在lib目录啊。

复制依赖的jar包

FatJar

在查资料的过程中,发现了FatJar这个概念,FatJar又叫UberJar,是一种可执行的jar包,因为它把依赖都打到包里面了。maven默认构建的jar包不是FatJar。

maven-dependency-plugin

这个插件可以帮我们把依赖的jar包复制到指定的目录,因此只要我们把目录指定为classpath中的目录(包括最终jar包所在目录),就能解决之前提到的问题。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

注意用eclipse自动生成的maven项目的pom.xml文件中只有pluginManagement,没有plugins。而这个plugin必须放在与pluginManagement同级的plugins下面,而不是pluginManagement子元素的plugins下面才有效。

更多解决方案

问题最终得到了解决,不过使用maven-dependency-plugin的缺点在于最终生成的jar包和依赖的jar包其实还是分离的,只是我们告诉了它寻找依赖jar包的方法。当我们把最终生成的jar包复制到其他目录执行时还是会出错。想要生成真正的FatJar可以利用maven-assembly-plugin或者maven-shade-plugin,这里就不具体介绍了。

相关文章

  • maven从没有属性清单说起

    使用maven构建的jar包在命令行用java -jar运行会提示"没有属性清单" 没有属性清单 为了让maven...

  • 运行 Maven 打包后的JAR包显示错误“没有主清单属性”

    问题: 通过maven打包程序后,直接执行jar包时,控制台显示“没有主清单属性”。 解决: 在maven的pom...

  • maven多profile一探究竟

    maven属性 maven自带的一些常用属性: ${project.build.sourceDirectory} ...

  • maven属性

    maven属性包括六种类型: 1)内置属性 2)pom属性 3)自定义属性 4)settings属性 5)Java...

  • springboot 使用 minio

    maven: 属性文件: 工具类:

  • Maven将工程打包成Jar的问题总结

    背景 直接用 mvn package打包了,结果是报错,没有主清单属性,然后百度了一堆,发现都是用maven-sh...

  • Profile

    帮助命令 查看项目中哪些profile被激活了 列出当前所有profile maven属性 maven有6类属性,...

  • Maven灵活构建

    Maven为了支持构建的灵活性,内置了3大特性,即:属性、Profile和资源过滤。 6.1 Maven属性 Ma...

  • Maven属性(properties)

    王某某 2017年2月 通过 元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的...

  • maven optional 属性

    有些时候 我们我们自己的jar需要引用一些别的组件,但是提供给别人调用时 别人其实用不上这部分功能,但是因为你自己...

网友评论

      本文标题:maven从没有属性清单说起

      本文链接:https://www.haomeiwen.com/subject/yquriqtx.html