maven指南
maven指南
@(OTHERS)[maven]
- maven指南
- 1maven下載出錯
- 2打包超級包shade與provided
- 3依賴沖突NoSuchMethodError ClassNotFoundException
- 4添加CDH的依賴
- 5忽略測試
- 6調整jdk版本
- 7SecurityException Invalid signature file digest for Manifest main attribute
- 8scala插件
- 9自定義變量
- 10依賴本地項目
- 11關于version的說明不要用變成充當version
1、maven下載出錯
有時候maven編譯或者打包時下載包的階段出錯,一般都是網絡問題,相信自己,你沒寫錯。如:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project myusml: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: Plugin org.apache.maven.plugins:maven-surefire-plugin:2.18.1 or one of its dependencies could not be resolved: Failed to collect dependencies at org.apache.maven.plugins:maven-surefire-plugin:jar:2.18.1 -> org.apache.maven.surefire:maven-surefire-common:jar:2.18.1: Failed to read artifact descriptor for org.apache.maven.surefire:maven-surefire-common:jar:2.18.1: Could not transfer artifact org.apache.maven.surefire:maven-surefire-common:pom:2.18.1 from/to central (https://repo.maven.apache.org/maven2): Remote host closed connection during handshake: SSL peer shut down incorrectly -> [Help 1]國內訪問某些外國網站的網絡很不穩定,因此需要添加國內的中央庫:
1、修改$M2_HOME/conf/setting.xml中添加國內的源
(1)配置 mirror
(2)配置 profile
<profiles> ...<profile><id>osc</id><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><id>osc</id><url>http://maven.oschina.net/content/groups/public/</url></repository><repository><id>osc_thirdparty</id><url>http://maven.oschina.net/content/repositories/thirdparty/</url></repository></repositories><pluginRepositories><pluginRepository><id>osc</id><url>http://maven.oschina.net/content/groups/public/</url></pluginRepository></pluginRepositories></profile> ... </profiles>詳見http://maven.oschina.net/help.html
2、出現以下錯誤:
Description Resource Path Location Type Could not calculate build plan: Failure to transfer org.apache.maven.plugins:maven-compiler-plugin:pom:2.0.2
執行:
find ~/.m2 -name “*.lastUpdated” -exec grep -q “Could not transfer” {} \; -print -exec rm {} \;
原因是之前有一些下載失敗了。
詳見http://stackoverflow.com/questions/5074063/maven-error-failure-to-transfer
3、配置eclipse使用本地安裝的maven,而不是自帶的版本。同時在User setting里面,也要指定setting.xml是使用哪個配置文件,從而指定國內的庫。
否則國內有時候連不上maven中央庫,導致出現以下異常:
如果還不行,先到命令行執行mvn clean package,看原因是什么,很有可能是連接中央庫失敗。
2、打包超級包:shade與provided
默認情況下,maven package只會將用戶的代碼打包,它會認為運行機器的classpath中存在它所需要的依賴包。但有時候需要將項目的所有依賴包都打包到發布的jar包中,此時可以通過以下的plugin實現:
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.3</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters></configuration></plugin></plugins> </build>如果有一部分依賴包不想打包進jar包中,可以指定其為provided。比如運行一個spark程序時,classpath中必然會加載spark的包,此時就可以將spark指定為provided。
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.10</artifactId><version>1.5.1</version><scope>provided</scope></dependency>使用這個plugin有可能出現以下錯誤:
2016-08-11 10:08:54,902 ERROR org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost: Failed to load coprocessor com.lujinhong.hbase.solr.indexer.SolrIndexerObserver java.lang.SecurityException: Invalid signature file digest for Manifest main attributesat sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:286)at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:239)at java.util.jar.JarVerifier.processEntry(JarVerifier.java:317)at java.util.jar.JarVerifier.update(JarVerifier.java:228)at java.util.jar.JarFile.initializeVerifier(JarFile.java:348)at java.util.jar.JarFile.getInputStream(JarFile.java:415)at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:775)at sun.misc.Resource.cachedInputStream(Resource.java:77)at sun.misc.Resource.getByteBuffer(Resource.java:160)at java.net.URLClassLoader.defineClass(URLClassLoader.java:436)at java.net.URLClassLoader.access$100(URLClassLoader.java:71)at java.net.URLClassLoader$1.run(URLClassLoader.java:361)at java.net.URLClassLoader$1.run(URLClassLoader.java:355)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:354)at org.apache.hadoop.hbase.util.CoprocessorClassLoader.loadClass(CoprocessorClassLoader.java:292)at org.apache.hadoop.hbase.coprocessor.CoprocessorHost.load(CoprocessorHost.java:183)at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.loadTableCoprocessors(RegionCoprocessorHost.java:326)at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.<init>(RegionCoprocessorHost.java:225)at org.apache.hadoop.hbase.regionserver.HRegion.<init>(HRegion.java:773)at org.apache.hadoop.hbase.regionserver.HRegion.<init>(HRegion.java:681)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:526)at org.apache.hadoop.hbase.regionserver.HRegion.newHRegion(HRegion.java:5677)at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:5987)at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:5959)at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:5915)at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:5866)at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.openRegion(OpenRegionHandler.java:356)at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.process(OpenRegionHandler.java:126)at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:128)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)解決方法見:
http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
即在plugin中添加以下內容【上面例子中已經包括了】:
<configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><!-- Additional configuration. --> </configuration>3、依賴沖突:NoSuchMethodError, ClassNotFoundException
如果在運行中出現NoSuchMethodError或者ClassNotFoundException的異常,而你又確定classpath中存在這個包,那是因為你的classpath中存在2個不同版本的jar包了,比如常見的log4j,你在classpath中添加了log4j.jar,而spark的lib目錄中也有log4j.jar,而且這2個jar包版本不一致的話,就會出現這種問題。
解決辦法有2種:
(1)修改程序,讓你的代碼使用spark(比如)提供的jar包的版本。
(2)使用稱為shading的方式修改你的應用。使用上面提到的maven-shade-plugin插件進行高級配置來支持這種打包方式。shading可以讓你以另一種命名空間保留沖突的包,并自動重寫應用的代碼使得它們使用重命名后的版本。這種技術有些簡單粗暴,不過對于解決運行時依賴沖突的問題非常有效。
另一個例子,storm使用了log4j2.x,而hbase使用了1.x,因此在storm項目中導入hbase需要將其exclude掉:
<dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency>只要log4j有類似NoClassDefindFound之類的沖突都這樣解決。
4、添加CDH的依賴
在pom.xml中增加以下內容:
<repositories><repository><id>cloudera</id><url>https://repository.cloudera.com/artifactory/cloudera-repos/</url></repository></repositories>然后指定CDH的版本:
<dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.0.0-cdh5.4.5</version></dependency>版本號可以從https://repository.cloudera.com/artifactory/cloudera-repos/查到。
5、忽略測試
-DskipTests,不執行測試用例,但編譯測試用例類生成相應的class文件至target/test-classes下。
-Dmaven.test.skip=true,不執行測試用例,也不編譯測試用例類。
6、調整jdk版本
在<profiles>標簽中增加以下內容
<profile><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties></profile>如果不指定這些參數,則會使用$JAVA_HOME定義的jdk版本。所以也可以通過改變$JAVA_HOME來改變行為
或者在pom.xml中添加以下內容:
<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></plugins0> </build>7、SecurityException: Invalid signature file digest for Manifest main attribute
見第2點shade與超級包里面有一種更好的解決方案。
使用maven打包(尤其是uber包)時,可能出現以下錯誤:
這是因為打包了一些元信息文件進包里面導致的,可以將其刪除:
zip -d jarname.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF8、scala插件
如果maven項目中有scala代碼,需要在pom.xml中添加以下內容:
<build><!--<sourceDirectory>src/main/scala</sourceDirectory>--><plugins><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><version>3.2.0</version><executions><execution><id>compile-scala</id><phase>compile</phase><goals><goal>add-source</goal><goal>compile</goal></goals></execution><execution><id>test-compile-scala</id><phase>test-compile</phase><goals><goal>add-source</goal><goal>testCompile</goal></goals></execution></executions><configuration><scalaVersion>2.11.8</scalaVersion></configuration></plugin>9、自定義變量
定義時:
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.version>0.2</project.version> </properties>使用時:
<groupId>com.lujinhong</groupId> <artifactId>lujinhong-commons</artifactId> <version>${project.version}</version>10、依賴本地項目
先將本地項目mvn install到本地,然后在項目中添加repo:
<repositories><repository><id>in-project</id><name>In Project Repo</name><url>file:///Users/liaoliuqing/.m2/repository</url></repository> </repositories>最后就可以正常的使用dependency了,如:
<dependency><groupId>com.lujinhong</groupId><artifactId>lujinhong-commons-hadoop</artifactId><version>${project.version}</version> </dependency>11、關于version的說明:不要用變成充當version
尤其是依賴于父項目的子模塊,不然會有各種問題:http://stackoverflow.com/questions/1981151/warning-on-using-project-parent-version-as-the-version-of-a-module-in-maven-3
[WARNING] ‘version’ contains an expression but should be a constant. @ com.lujinhong:lujinhong-commons:${project.version}, /Users/liaoliuqing/99_Project/lujinhong-commons/pom.xml, line 9, column 11
總結
- 上一篇: 使用github pages创建博客
- 下一篇: Java解析HTML之HTMLParse