zoukankan      html  css  js  c++  java
  • 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_oop_方法2
    POJ 3276 Face The Right Way(反转)
    POJ 3276 Face The Right Way(反转)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3061 Subsequence(尺取法)
    POJ 3061 Subsequence(尺取法)
    HDU 1222 Wolf and Rabbit(欧几里得)
  • 原文地址:https://www.cnblogs.com/mathlin/p/15541049.html
Copyright © 2011-2022 走看看