Maven+scala+spark常見問題總結
去除[WARNING] Using platform encoding (UTF-8 actually) to copy filter
在POM檔案的頂級目錄中,加入下面的配置。其實就是設定一下工程的編碼格式
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
[maven3 warning] ‘dependencies.dependency.systemPath’ should not point at files within the project directory
systemPath被設計用來講一些系統庫包含進來,它們往往具有固定的路徑。當在自己的project中使用這個特性但是指定相對路徑如${basedir}/src/lib之類的,就會提示這個。解決方法如下:
- 如果中央倉庫有你需要的包,那最好不過了,直接通過制定dependency來自動下載就好。
- 然而有時候你使用的一些第三方包,倉庫中是沒有的,這個時候,可以使用maven-install-plugin
來將該第三方包安裝到本地倉庫中即可。步驟如下(這裡以spark-liblinear-1.95.jar為例):
首先檢視這個包的層次結構,其實就是為了獲取它的groupId, artifactId。然後在工程中的POM檔案中加入這個包的依賴:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
</plugins>
</build>
然後執行下面的命令即可將第三方包安裝到本地倉庫中(注意,這裡的groupId,artifactId要和上面的依賴中所寫的一致,另外,-D選項和後面的引數之間不能有空格):
mvn install:install-file -Dfile=src/lib/spark-liblinear-1.95.jar -DgroupId=tw.edu.ntu.csie -DartifactId=liblinear -Dversion=1.95 -Dpackaging=jar
如果是要部署到自己公司的私有倉庫中,可以使用下面的命令(沒具體試驗過):
mvn deploy:deploy-file -DgroupId=com.bea.xml -DartifactId=jsr173-ri -Dversion=1.0 -Dpackaging=jar -Dfile=[path to file] -Durl=[url] -DrepositoryId=[id]
將專案所有依賴的jar全部打包進最終的專案jar包中
直接使用maven自帶的外掛進行打包的話,專案依賴的jar不會被打包進最終的專案jar包中,同時,生成的jar包中的META-INF/MENIFEST.MF檔案中,也沒有指定主類,這樣的包無法直接執行的。為了解決這個問題,可以使用maven-shade-plugin外掛。在專案POM檔案中,新增下面的配置程式碼(我工程的主類是my.maven.learn.App):
<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>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>my.maven.learn.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
之後執行mvn package 就會將所以依賴全部打包進jar包中,同時還會根據配置來自動設定主類。注意上面的filter程式碼段,shade在打包時,預設會將一些無用的檔案加入到META-INF中,如果不將這些檔案排除出去,則最終得到的jar包是無效的,無法執行。
[WARNING] Expected all dependencies to require Scala version: 2.10.4
我使用的是net.alchim31.maven:scala-maven-plugin外掛, 配置檔案中新增如下程式碼(其中scala.version設定為2.10.4, scala.binary.version設定為2.10):
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.1.6</version>
<configuration>
<scalaCompatVersion>${scala.binary.version}</scalaCompatVersion>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
src/main/resources 中資原始檔的訪問方法:
maven在compile階段,會將src/main/resources中的資原始檔複製到target/classes目錄下,因而如果要在程式碼中訪問resources目錄中的資原始檔,只需要一下程式碼即可(此處假設需要訪問的檔案為src/main/resources/tt.txt):
getClass.getResource("/tt.txt");