• 2021-11-11 Maven引入本地jar包并生成jar包运行修改MANIFEST.MF文件


    从第三方下载的jar复制到src/main/resources/lib目录下(新建lib目录),

    引用方式:

    <dependency>
      <groupId>SMS_SDK_JAVA</groupId>
      <artifactId>SMS_SDK_JAVA</artifactId>
      <version>v2.6.3r</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/src/main/resources/lib/SMS_SDK_JAVA_v2.6.3r.jar</systemPath>
    </dependency>

    这里的scope只能是system范围,systemPath属性指定jar的路径。

    看下原本的打包方式:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <archive>
          <manifest>
            <-- 在jar包的MF文件中生成Class-Path属性 -->
            <addClasspath>true</addClasspath>
            <-- Class-Path 前缀 -->
            <classpathPrefix>lib/</classpathPrefix>
            <-- main全限定包名 -->
            <mainClass>xxx.MainTask</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
     
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.3</version>
      <configuration>
        <descriptors>
          <descriptor>src/main/resources/assembly.xml</descriptor>
        </descriptors>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

    assembly.xml就不贴出来了,主要工作就是打tar.gz包。 打出来的jar包中,并不包含system范围的jar包,就是第三方的包。并且在jar包的MF文件的classpath也未找到第三方的lib路径。

    最后修改如下:

    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <classpathPrefix>lib/</classpathPrefix>
          <mainClass>com.madhouse.platform.maddsp.task.MainTask</mainClass>
        </manifest>
        <-- 添加classpath缺少的内容-->
        <manifestEntries>
          <Class-Path>lib/SMS_SDK_JAVA_v2.6.3r.jar</Class-Path>
        </manifestEntries>
      </archive>
    </configuration>

    最主要是这个地方:

    这样第三方的jar包就包含在classpath中,运行的java -jar xxx.jar的时候,也就不会报NoClassFound错误了。

    完整的MF内容如下:

    Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Created-By: Apache Maven
    Built-By: zhujiajun
    Build-Jdk: 1.7.0_72
    Main-Class: xxx.MainTask
    Class-Path: lib/SMS_SDK_JAVA_v2.6.3r.jar lib/org.apache.oltu.oauth2.resourceserver-1.0.0.jar l
     ib/org.apache.oltu.oauth2.common-1.0.0.jar lib/json-20131018.jar lib/
     org.apache.oltu.oauth2.resourceserver-filter-1.0.0.jar lib/org.apache
     .oltu.oauth2.client-1.0.0.jar lib/druid-1.0.14.jar lib/ehcache-core-2
     .6.10.jar lib/spring-websocket-4.1.2.RELEASE.jar lib/spring-core-4.1.
     2.RELEASE.jar lib/spring-messaging-4.1.2.RELEASE.jar lib/spring-beans
     -4.1.2.RELEASE.jar lib/mail-1.4.4.jar lib/activation-1.1.jar lib/slf4
     j-api-1.7.5.jar lib/logback-classic-1.0.11.jar lib/logback-core-1.0.1
     1.jar lib/poi-3.11.jar lib/commons-codec-1.9.jar lib/poi-ooxml-3.11.j
     ar lib/poi-ooxml-schemas-3.11.jar lib/xmlbeans-2.6.0.jar lib/stax-api
     -1.0.1.jar lib/junit-4.10.jar lib/hamcrest-core-1.1.jar lib/spring-te
     st-4.1.2.RELEASE.jar lib/fastjson-1.1.37.jar lib/commons-fileupload-1
     .3.1.jar lib/commons-io-2.2.jar lib/httpmime-4.3.5.jar lib/httpclient
     -4.3.5.jar lib/httpcore-4.3.2.jar lib/commons-logging-1.1.3.jar lib/j
     stl-1.2.jar lib/jedis-2.6.0.jar lib/commons-pool2-2.0.jar lib/mybatis
     -3.2.8.jar lib/mybatis-spring-1.2.2.jar lib/mysql-connector-java-5.1.
     31.jar lib/spring-web-4.1.2.RELEASE.jar lib/spring-aop-4.1.2.RELEASE.
     jar lib/aopalliance-1.0.jar lib/spring-webmvc-4.1.2.RELEASE.jar lib/s
     pring-expression-4.1.2.RELEASE.jar lib/spring-context-4.1.2.RELEASE.j
     ar lib/spring-context-support-4.1.2.RELEASE.jar lib/spring-jdbc-4.1.2
     .RELEASE.jar lib/spring-aspects-4.1.2.RELEASE.jar lib/aspectjweaver-1
     .8.3.jar lib/spring-tx-4.1.2.RELEASE.jar lib/spring-data-redis-1.4.2.
     RELEASE.jar

    另外如果有需要可以定制MF文件,参考 Apache Maven manifestEntries官网说明 和 IBM Apache Maven您不知道的5件事

    文件的详解:

    JAR包中的MANIFEST.MF文件详解以及编写规范

    项目引入第三方包,及把依赖的jar包抽离出来。pom.xml文件的配置。

    <build>
            <plugins>
            <!-- 第一步:打包业务jar包,排除配置文件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                     <configuration>
                        <archive>
                            <manifest>
                                <mainClass>cn.paohe.Application</mainClass>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib</classpathPrefix>
                            </manifest>
                            <!-- 添加classpath缺少的内容,要拼在一起,要不然会只读最后一个-->
                            <manifestEntries>
                                <Class-Path>resources/ lib/ssosdk-2.0.0.jar lib/ssomodel-2.0.0.jar</Class-Path>
                            </manifestEntries>
                        </archive>
                        <outputDirectory>${project.build.directory}</outputDirectory>
                        <excludes>
                            <exclude>**/*.properties</exclude>
                            <exclude>**/*.xml</exclude>
                            <exclude>**/*.yml</exclude>
                            <exclude>static/**</exclude>
                            <exclude>templates/**</exclude>
                        </excludes> 
                    </configuration>
                </plugin>
                <!-- 第二步:将三方依赖jar包输出到步骤一指定目录lib -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy-dependencies</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.directory}/lib</outputDirectory>
    
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <!-- 第三步:将静态资源配置文件输出到步骤一指定目录resources -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <executions>
                        <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF-8</encoding> 
                            <outputDirectory>${project.build.directory}/resources</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                    </executions>
                </plugin>
                <!-- 最后调整一下spring-boot-maven-plugin -->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <mainClass>cn.paohe.Application</mainClass>
                        <includes>
                            <include>
                                 <groupId>nothing</groupId>
                                 <artifactId>nothing</artifactId>
                            </include>
                        </includes>
                        <addResources>true</addResources>
                        <!--值为true是指打包时包含scope为system的第三方Jar包-->
                        <includeSystemScope>true</includeSystemScope>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

    打包后项目的目录。

  • 相关阅读:
    关于Java中System.currentTimeMillis和System.nanoTime的错误认识
    多线程以外
    vim 小技巧
    Virtual Box HostOnly网络模式配置
    How 30 Minutes a Day Can Increase Your Intelligence
    YUM命令使用
    Hash算法及其应用
    jetty + apache httpd 反向代理配置
    使用SCTP优化网络
    .NET书籍推荐
  • 原文地址:https://www.cnblogs.com/mathlin/p/15541049.html
Copyright © 2020-2023  润新知