Maven&Intellij IDEA打jar包以及创建scal

2018-07-17  本文已影响0人  wong小尧

1.Maven

1.1 Maven依赖:

进入这个网址查jar包依赖
http://mvnrepository.com/
将xml代码复制到你的pom.xml中即可。

如果有时候用的是别人的代码。
可以打开pom.xml文件,按“alt + insert”,
弹出:



点击dependency



搜索缺少的包,点击“add”。
idea中在这里配置自己的maven(maven,设置文件,本地仓库),有时候自己配置的新版本的maven会有不兼容的问题,也可以用idea自带的。

1.2 Maven 常用指令:

常用命令为 :

1.mvn archetype:create :创建 Maven 项目
2.mvn compile :编译源代码
3.mvn clean compile:清理并编译
4.mvn test-compile :编译测试代码
5.mvn test : 运行应用程序中的单元测试
6.mvn site : 生成项目相关信息的网站
7.mvn clean :清除目标目录中的生成结果
8.mvn package : 依据项目生成 jar 文件
9.mvn deploy:生成jar文件并上传到本地和私服仓库
10.mvn install    在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库)

有时候需要把自己的包上传到本地maven作为依赖包。

如果需要在里面加入外部的jar包,需要在maven中安装。
进入maven的bin文件夹,如果配置了环境变量不在bin文件夹也可以,用指令安装该jar包,Dfile参数可以写入文件的路径,但是我试了一下失败了,cd到该文件目录下,不写路径安装就成功了。
在IDEA终端中输入:
mvn install:install-file -Dfile=xgboost4j-0.7-dependencies.jar -DgroupId=ml.dmlc -DartifactId=xgboost4j -Dversion=0.7 -Dpackaging=jar
mvn install:install-file -Dfile=scopt_2.10-3.3.0.jar -DgroupId=com.github.scopt -DartifactId=scopt_2.10 -Dversion=3.3.0 -Dpackaging=jar
再添加依赖就正常了
<dependency>
<groupId>com.github.scopt</groupId>
<artifactId>scopt_2.10</artifactId>
<version>3.3.0</version>
</dependency>

-Dfile:包的本地真实地址(如果在当前文件夹下,直接写名字)
-DgroupId:pom.xml中groupId
-DartifactId:pom.xml中artifactId
-Dversion:pom.xml中版本号
-Dpackaging:jar或war,包的后缀名
-Dclassifier:兄弟包的别名,也就是-Dversion值后面的字符workspace-1.1.1-SNAPSHOT-core.jar的-core,我没有用到。

第一种方法:

在本地 Repository 中安装 jar。
Dfile参数是该jar包的全路径,-DartifactId、-Dversion等属性要与pom.xml文件中的依赖属性一致:
Dfile路径最好是直接在D盘C盘这种文件夹下面,试过把文件放在桌面上,发现识别不了
-Dversion= pom.xml中的版本号
-DartifactId=pom.xml中的artifactId
-DgroupId=pom.xml中的groupId

mvn install
(mvn install:install-file -Dfile=新框架.jar -DgroupId=com. xx.xx -DartifactId=NAME -Dversion=0.0.1 -Dpackaging=jar  -DgeneratePom=true)

mvn install:install-file -Dfile=xgboost4j-0.7.jar -DgroupId=ml.dmlc -DartifactId=xgboost4j -Dversion=0.7 -Dpackaging=jar

如果显示build success,则安装成功了,可以去maven的本地目录查看一下文件是否生成。

第二种方法

读取系统本地的jar包,改依赖中的参数即可。

    <dependency>    
      <groupId>org.jblas</groupId>     
        <artifactId>jblas</artifactId>   
          <version>1.2.3</version>     
      <scope>system</scope>
    <systemPath>${basedir}/*****.jar</systemPath>
    </dependency>

install&package&deploy的区别
package命令完成了项目编译、单元测试、打包功能。用于生成jar包。
install完成package的功能以后,同时把打好的可执行jar包布署到本地maven仓库,这样可以通过修改maven依赖来使用。
deploy完成install功能以后,同时把打好的可执行jar包布署到本地maven仓库和远程maven私服仓库。

2.用Intellij IDEA 打包jar

如果之前已经打过jar包的话,先删除META-INF文件夹下的MANIFEST.MF配置文件,才能重新生成jar包。

2.1.File->Project Structure->Artifacts->Add->Jar->From modules with dependencies

ctrl + alt + shift +s或者点击图标



来打开Project Structure。

然后,点击add光标
来添加jar包。

2.2.配置

第一步选择Main函数执行的类。



第二步选择如图的选项,目的是对第三方Jar包打包时做额外的配置,如果不做额外的配置可不选这个选项(但不保证打包成功)



第三步删除不需要的模块
按住shift点击不需要的模块,然后点击remove删除。

通常是留下最后的文件夹,其他全部删除。



第三步点击build,然后选择build artifacts,就能在out文件夹里找到jar包。

2.3.直接打包

使用IDEA + Maven 创建scala项目时,勾选Create for archetype,找到org.scala-tools.archetypes:scala-archetype-simple然后点next。
创建完项目以后出现:Maven projects need to be imported
选择Enable Auto-Import,这样就会自动配置pom.xml文件
右边会出现Maven Projects,点开里面会有运行编译测试等等功能。

点击build(ctrl + F9)


windows
mac

再点击package



jar包就会出现在target文件夹下。

注意事项:

此方法需要删除test文件夹,否则打包的时候会报错。

如果不打算删除test文件夹,那么需要再对应pom.xml文件目录中构建这两个文件夹路径。(src/main/scala和src/test/scala)

    <build>
      <sourceDirectory>src/main/scala</sourceDirectory>
      <testSourceDirectory>src/test/scala</testSourceDirectory>
    </build>
另外<properties>中可能指定了scala版本之类的信息:
    <properties>
        <spark.version>2.2.1</spark.version>
        <scala.version>2.11.8</scala.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

如果package时打包出错,并出现scala版本的问题可以把<properties>这一项改成:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
如果Maven Project 这一栏隐藏了,点击搜索图标

搜索 Maven Project,再点击即可。

3.IDEA加载github下载的java,scala项目

代码通过git clone或者下载zip得到

3.1 打开

选择 File-->Open... 打开下载的项目

3.2 配置JDK

File--> Project Structure ---> Project---->选择JDK (不能选就new一个选中本机JDK)

3.3 选择 Modules

Project Structure界面,设置目录。
target或out设置Excluded,src设置Sources


3.4 程序包junit.framework不存在

编译时会报错,报“junit.framework不存在”错误。
一般来说pom中有junit包的依赖,但是有scope属性。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

依赖加入scope属性后,就会被约束在该生命周期内,在compile阶段不引入test阶段的依赖,也就是说编译阶段该依赖无效。可以删除scope,或者修改scope属性:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>compile</scope>
</dependency>

4.创建scala project

4.1.新建project,并勾选
4.2.按两下shift搜索scala-archetype-simple


4.3.修改pom依赖

通常我这边依赖写成:

<dependencies>
  <dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.11.0</version>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.2.1</version>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.11</artifactId>
    <version>2.2.1</version>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.1.1</version>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
    <version>2.1.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_2.11</artifactId>
    <version>2.2.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.4.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-yarn-client</artifactId>
    <version>2.4.1</version>
  </dependency>

  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.4</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.specs</groupId>
    <artifactId>specs</artifactId>
    <version>1.2.5</version>
    <scope>test</scope>
  </dependency>
</dependencies>

有时候会报错
expected START_TAG or END_TAG not TEXT
这是依赖前面有空格造成的,删除空格以后直接回车。

其中Spark-Core提供Spark最基础与最核心的功能,主要包括以下功能:
(1)SparkContext:
通常而言,Driver Application的执行与输出都是通过SparkContext来完成的。在正式提交Application之前,首先需要初始化SparkContext。SparkContext隐藏了网络通信、分布式部署、消息通信、存储能力、计算能力、缓存、测量系统、文件服务、Web服务等内容,应用程序开发者只需要使用SparkContext提供的API完成功能开发。SparkContext内置的DAGScheduler负责创建Job,将DAG中的RDD划分到不同的Stage,提交Stage等功能。内置的TaskScheduler负责资源的申请,任务的提交及请求集群对任务的调度等工作。
(2)存储体系:
Spark优先考虑使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,这极大地减少了磁盘IO,提升了任务执行的效率,使得Spark适用于实时计算、流式计算等场景。此外,Spark还提供了以内存为中心的高容错的分布式文件系统Tachyon供用户进行选择。Tachyon能够为Spark提供可靠的内存级的文件共享服务。
(3)计算引擎:
计算引擎由SparkContext中的DAGScheduler、RDD以及具体节点上的Executor负责执行的Map和Reduce任务组成。DAGScheduler和RDD虽然位于SparkContext内部,但是在任务正式提交与执行之前会将Job中的RDD组织成有向无环图(DAG),并对Stage进行划分,决定了任务执行阶段任务的数量、迭代计算、shuffle等过程。
(4)部署模式:
由于单节点不足以提供足够的存储和计算能力,所以作为大数据处理的Spark在SparkContext的TaskScheduler组件中提供了对Standalone部署模式的实现和Yarn、Mesos等分布式资源管理系统的支持。通过使用Standalone、Yarn、Mesos等部署模式为Task分配计算资源,提高任务的并发执行效率。

4.4.插件(maven-shade-plugin,maven-jar-plugin)

有的时候需要引用一些外部包或者文件,需要把集群中没有的库或者文件一起打进jar包。例如可以用shade把分词工具anjs打进jar包:
maven-jar-plugin
使用maven-jar-plugin这个插件可以去掉一些不想要的文件或者类。

           <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
                             <!-- 指定入口函数 -->
                             <mainClass>com.main.Jar</mainClass>
                             <!-- 是否添加依赖的jar路径配置 -->
                            <addClasspath>true</addClasspath>
                             <!-- 依赖的jar包存放未知,和生成的jar放在同一级目录下 -->
                             <classpathPrefix>lib/</classpathPrefix>
                         </manifest>
                     </archive>
                     <!-- 不打包com.library下面的所有文件或类 -->
                     <excludes>com.library/*</excludes>
                 </configuration>
            </plugin>

maven-shade-plugin
依赖:
为了防止打出来的jar包占用太大空间,已有的包不需要使用shade打包,集群中没有的才需要。在已经有的包后面加上<scope>provided</scope>,这样这些库就不会被打包,没有这句的包会打进jar包。

<dependencies>
  <dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.11.0</version>
  </dependency>

  <dependency>
      <groupId>org.ansj</groupId>
      <artifactId>ansj_seg</artifactId>
      <version>5.1.1</version>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.11</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
<version>2.1.1</version>
<scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
<version>2.1.1</version>
<scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
<version>2.4.1</version>
<scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-yarn-client</artifactId>
<version>2.4.1</version>
<scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.4</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.specs</groupId>
    <artifactId>specs</artifactId>
    <version>1.2.5</version>
    <scope>test</scope>
  </dependency>
</dependencies>

  <build>
//插件
    <plugins>
      <!-- the Maven compiler plugin will compile Java source files 编译JAVA的插件-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <!-- the Maven Scala plugin will compile Scala source files 编译scala插件-->
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.2.2</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!-- configure the eclipse plugin to generate eclipse project descriptors for a Scala project -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.10</version>
        <configuration>
          <projectnatures>
            <projectnature>org.scala-ide.sdt.core.scalanature</projectnature>
            <projectnature>org.eclipse.jdt.core.javanature</projectnature>
          </projectnatures>
          <buildcommands>
            <buildcommand>org.scala-ide.sdt.core.scalabuilder</buildcommand>
          </buildcommands>
          <classpathContainers>
            <classpathContainer>org.scala-ide.sdt.launching.SCALA_CONTAINER</classpathContainer>
            <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
          </classpathContainers>
          <excludes>
            <exclude>org.scala-lang:scala-library</exclude>
            <exclude>org.scala-lang:scala-compiler</exclude>
          </excludes>
          <sourceIncludes>
            <sourceInclude>**/*.scala</sourceInclude>
            <sourceInclude>**/*.java</sourceInclude>
          </sourceIncludes>
        </configuration>
      </plugin>

      <!-- allows the route to be run via 'mvn exec:java' -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <configuration>
          <mainClass>UP.MyRouteMain</mainClass>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <shadedArtifactAttached>true</shadedArtifactAttached>
//有时候需要同时部署使用shade和不使用shade两种jar包
//那么在shadedClassifierName后加上名称,该名称作为后缀在shade构件jar包后
              <shadedClassifierName>wangyao</shadedClassifierName>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

4.5. 更新插件
Intellj Idea 可以自动载入Maven依赖,但有使用Mac book的时候常常会碰到问题,导致pom文件修改却没有触发自动重新载入的动作。点击Maven Project=》你的项目名称=》Plugins,一些插件下面有红色下划线且尾部带有"unknow",此时就需要手动强制更新依赖。
两个方法:
(1)右键单击项目;
(2)点击Maven=》Reimport菜单项。


或者,IDEA将通过网络自动下载相关依赖,并存放在Maven的本地仓库中。另外,可以将Maven的刷新设置为自动,配置方法为:

(1)单击File|Setting菜单项,打开Settings选项卡;
(2)在左侧的目录树中,展开Maven节点;
(3)勾选Import Maven projects automatically选择项。
(4) 项目右键-》Maven-》Reimport
(5) 操作之后你就可以发现maven的依赖包已经更新!

4.6 Maven镜像

在maven里创建MyRepository目录,
我一般叫maven-dependcies,那就是<localRepository>D:/maven-dependcies</localRepository>
打开maven下的conf\settings.xml,如果是idea自带的要去idea的插件里面找maven,在conf文件夹里。
在<settings>后面加上
<localRepository>maven路径\MyRepository</localRepository>
对应自己MyRepository的路径。

国外源下载太慢,在setting.xml中mirrors节点中增加一段代码:

 <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
 </mirror> 

使用阿里云的镜像速度会更快。

5.新建package



6.在package里新建scala object


7.package显示
有的时候package是叠在一起的,没法再一个package下创建多个子package。
点击小齿轮,然后把Hide Empty Middle Packages取消就可以了


上一篇下一篇

猜你喜欢

热点阅读