1. 程式人生 > >Maven+scala+spark常見問題總結

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");