引用的第三方jar的目录结构(示例)



我的lib是在resources目录下的。

引入第三方jar进行dependency使项目内能import

其实用命令行的方式将jar包打到本地仓库,然后dependency也行,但是因为我需要将jar放到linux机器中,总不能每次换环境都要执行一次命令吧,而且jar包很多的时候呢?(你要会docker当我没说。),所以我用了下面的方法。

 <dependency>
            <groupId>com.fbcds</groupId>//随便写,一个唯一的标识,不能重复
            <artifactId>bcpkix-jdk15on-1.57</artifactId>
            //artifactId虽然也是随便写,但是后面会用到,所以需要记录下来。
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/bcpkix-jdk15on-1.57.jar</systemPath>
            //systemPath第三方jar在本地的目录,${project.basedir}自动获取
            //项目路径
</dependency>

这里只演示了jar中的一个,其他的省略但是注意

groupId和artifactId不能重复,artifactId和version后面会用到,所以artifactId最好用jar包的名字

本地编译

本地idea中编译的时候会classnotfound

  <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                        <extdirs>lib/bcprov-jdk15on-1.57.jar</extdirs>
                        <extdirs>lib/com.ibm.mq.allclient-9.0.4.0.jar</extdirs>
                        <extdirs>lib/javax.jms-api-2.0.1.jar</extdirs>
                        <extdirs>lib/javax.servlet-api-3.1.0.jar</extdirs>
                        <extdirs>lib/bcpkix-jdk15on-1.57.jar</extdirs>
                    </compilerArguments>
                </configuration>
</plugin>

加入相应的extdirs即可 ,比如我这里的lib/bcprov-jdk15on-1.57.jar

第三方jar一起打到jar中

问题:上一步本地编译没问题了,终端到生成的jar的目录,java -jar,还是报错classnotfound

比如我的错误:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/ibm/mq/MQException
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
	at java.lang.Class.getMethod0(Class.java:3018)
	at java.lang.Class.getMethod(Class.java:1784)
	at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.ibm.mq.MQException
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 7 more

原因:idea中是自带classpath的功能的,包括war包中也有这个功能,可是java -jar的时候classpath就没有了,而且只要一执行-jar的命令,命令行的-classpath就失效的了,只能去MANIFEST.MF中去找classpath,在这里我们是空的,只能通过手动写进去,或者通过maven配置写进去,但是前提是现在必须有jar包,否则即使写了classpath也是无济于事的

解决:

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

${project.build.directory}是target目录,会在target目录下生成lib文件,并将jar包打入到,里面。

注意:jar包的名字是dependency中的artifactId-version格式的。

如图:

在linux机器中解决classnotfound

上一节中已经将jar包打入到了target目录中

这里需要MANIFEST.MF中写入classpath

<plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-jar-plugin</artifactId>

                <configuration>

                    <classesDirectory>${project.build.directory}/classes</classesDirectory>

                    <archive>

                        <manifest>

                            <addClasspath>true</addClasspath>

                            <classpathPrefix>lib/</classpathPrefix>

                            <mainClass>Main</mainClass>

                            <useUniqueVersions>false</useUniqueVersions>

                        </manifest>

                        <manifestEntries>

                            <Class-Path>lib/bcpkix-jdk15on-1.57-1.0.jar lib/bcprov-jdk15on-1.57-1.0.jar lib/com.ibm.mq.allclient-9.0.4.0-1.0.jar lib/javax.jms-api-2.0.1-1.0.jar lib/javax.servlet-api-3.1.0-1.0.jar

                            </Class-Path>

                        </manifestEntries>

                    </archive>

                </configuration>

            </plugin>

注意:classpath中间用空格隔开,这里的路径是相对路径,名字就是我们target目录下lib中相对应的jar包的名字。所以第一步中的artifactId和version还是很重要的。

当然Class-Path写成${basedir}/libs/xxx.jar也是可以的,这是如果在本地运行的话,但是如果像我这样将jar包放到linux服务其中是读不到basedir目录的。

到这里将target目录压缩成zip包,scp到linux机器中,解压缩,进入target目录,执行

java -jar xxx.jar

完整pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cloudwise</groupId>
    <artifactId>ibmmq_consumer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.fbcds</groupId>
            <artifactId>bcpkix-jdk15on-1.57</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/bcpkix-jdk15on-1.57.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.aaa</groupId>
            <artifactId>bcprov-jdk15on-1.57</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/bcprov-jdk15on-1.57.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.sss</groupId>
            <artifactId>com.ibm.mq.allclient-9.0.4.0</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/com.ibm.mq.allclient-9.0.4.0.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.ddd</groupId>
            <artifactId>javax.jms-api-2.0.1</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/javax.jms-api-2.0.1.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.fff</groupId>
            <artifactId>javax.servlet-api-3.1.0</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/javax.servlet-api-3.1.0.jar</systemPath>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-jar-plugin</artifactId>

                <configuration>

                    <classesDirectory>${project.build.directory}/classes</classesDirectory>

                    <archive>

                        <manifest>

                            <addClasspath>true</addClasspath>

                            <classpathPrefix>lib/</classpathPrefix>

                            <mainClass>Main</mainClass>

                            <useUniqueVersions>false</useUniqueVersions>

                        </manifest>

                        <manifestEntries>

                            <Class-Path>lib/bcpkix-jdk15on-1.57-1.0.jar lib/bcprov-jdk15on-1.57-1.0.jar lib/com.ibm.mq.allclient-9.0.4.0-1.0.jar lib/javax.jms-api-2.0.1-1.0.jar lib/javax.servlet-api-3.1.0-1.0.jar

                            </Class-Path>

                        </manifestEntries>

                    </archive>

                </configuration>

            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                        <extdirs>lib/bcprov-jdk15on-1.57.jar</extdirs>
                        <extdirs>lib/com.ibm.mq.allclient-9.0.4.0.jar</extdirs>
                        <extdirs>lib/javax.jms-api-2.0.1.jar</extdirs>
                        <extdirs>lib/javax.servlet-api-3.1.0.jar</extdirs>
                        <extdirs>lib/bcpkix-jdk15on-1.57.jar</extdirs>
                    </compilerArguments>
                </configuration>
            </plugin>

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

        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>

    </build>

</project>

完结。

maven项目引入外部第三方jar包,引入、本地编译、第三方jar一起打到jar中、在linux机器中解决classnotfound(配置classpath),笔记整理。的更多相关文章

  1. maven项目引用外部jar包的方法

    问题描述: 有一个java maven web项目,需要引入一个第三方包gdal.jar,但是这个包是自己打包的,在maven中央库里面找不到该包,因此我采用传统的方式,将这个包拷贝到:项目名称\sr ...

  2. SpringBoot引入第三方jar包或本地jar包的处理方式

    在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 第一种是将本地jar包安装在本地maven库 第二种是将本地ja ...

  3. eclipse把jar包引入项目的两种方法

    方法一: build path引入jar包 方法二: 把jar包放入lib文件夹 区别: 把jar包放入lib文件夹,以后把程序发给别人,别人可以直接运行而无需再自己添加jar包 总结: 1.有时即使 ...

  4. 如何利用maven将本地jar包引入到工程之中

    1.在个人开发模式下,可以将jar包放入项目的lib目录中,在pom.xml中做如下配置: <dependencies> <dependency> <groupId> ...

  5. maven项目引用外部jar

    问题描述: 有一个java maven web项目,需要引入一个第三方包gdal.jar,但是这个包是自己打包的,在maven中央库里面找不到该包,因此我采用传统的方式,将这个包拷贝到:项目名称\sr ...

  6. 【Maven】2.使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库

    参考文章: http://www.cnblogs.com/luotaoyeah/p/3791966.html --------------------------------------------- ...

  7. 使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库

    1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...

  8. Ant-编译构建(2)-第3方jar包引入、log4j2

    1.项目目录结构图,lib包引入了一些关于common logging+log4j2相关的jar. 2.编写相关的build.xml <?xml version="1.0" ...

  9. Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法

    本博客包含的内容: ①手动安装jar包到本地仓库: ②解决Missing artifact org.source.fastdfs:fastdfs:jar问题 .personSunflowerP { b ...

随机推荐

  1. 干货满满!10分钟看懂Docker和K8S

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...

  2. quartz的使用(三)

    1.在数据源数据库中执行下载的quartz的sql语句(创建11张表),其中表头qrtz_可以在在配置文件中更改,对应表创建时更改org.quartz.jobStore.tablePrefix=qrt ...

  3. leetcode-第11场双周赛-5089-安排会议日程

    题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...

  4. Spring - @ManagedResource, @ManagedOperation, @ManagedAttribute

    总结 通过annotation (@ManagedResource, @ManagedOperation, @ManagedAttribute)注解注册MBean到JMX实现监控java运行状态 参考 ...

  5. TPCx-BB官宣最新世界纪录,阿里巴巴计算力持续突破

    2019年9月17日,TPC官宣Alibaba Cloud MaxCompute认证结果.同月26日,杭州云栖大会阿里巴巴宣布了这一成绩,飞天大数据平台计算引擎MaxCompute成为全球首个TPCx ...

  6. 使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ)

    fatal error C1071: unexpected end of file found in comment(Mark ZZ) 今天在一论坛上看到一人发帖: 『最近遇到一个奇怪的问题,代码中的 ...

  7. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

  8. Redis基于主从复制的RCE(redis4.x 5.x)复现

    使用docker建立redis 拉取镜像 运行 查看 可以连接,存在未授权 https://github.com/Ridter/redis-rce 发送poc i:正向连接 r:反弹 反弹成功

  9. 剑指offer——29顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  10. CSS3教程:Responsive框架常见的Media Queries片段

    CSS3 Media Queries片段在这里主要分成三类:移动端.PC端以及一些常见的响应式框架的Media Queries片段.移动端Media Queries片段iPhone5@media sc ...