Maven+scala+spark常见问题总结

来源:互联网 发布:刘意 java 编辑:程序博客网 时间:2024/06/06 09:03

去除[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");

0 0