個人lib是在resources目錄下的。java
其實用命令行的方式將jar包打到本地倉庫,而後dependency也行,可是由於我須要將jar放到linux機器中,總不能每次換環境都要執行一次命令吧,並且jar包不少的時候呢?(你要會docker當我沒說。),因此我用了下面的方法。 linux
<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包的名字 web
本地idea中編譯的時候會classnotfounddocker
<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.jarapache
問題:上一步本地編譯沒問題了,終端到生成的jar的目錄,java -jar,仍是報錯classnotfound
好比個人錯誤:api
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也是無濟於事的 maven
解決:ide
<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格式的。
如圖:
svg
上一節中已經將jar包打入到了target目錄中
這裏須要MANIFEST.MF中寫入classpathui
<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
<?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>
完結。