分享

IntelliJ IDEA 多个Scala项目如何实现相互调用




问题导读:

1.怎样用IntelliJ IDEA开发多个项目?
2.开发多个项目过程中有哪些注意事项?
3.多个项目之间的依赖关系是怎样的?






目录
1、需求
2、注意事项(6点非常重要)
3、建立Project和建立module
4、项目之前的依赖关系
5、代码展示
6、项目中POM依赖展示
7、运行结果展示

1、需求
1、IntelliJ IDEA打开多个项目

2、每个同学开发一个项目,相互之前独立不影响

3、通过一个入口可以调用所有项目类、方法、属性,达到同时开发且检测代码

4、dependency只需要写一份,其余项目不用写,便可全部依赖

2、注意事项(非常重要)
6个坑:

1、<groupId>com.yh.bi</groupId>
项目中所有的groupId要一样

2、避免循环依赖,导致程序报错

3、<scope>provided</scope>

打包的服务器运行时候需要provided,本机调试的时候,需要注释

在一个maven项目中,如果存在编译需要而发布不需要的jar包,可以用scope标签,值设为provided

20170210165925271.png

4、项目、module建好之后需要添加Scala的框架支持

20170210145525041.png

5、在yhProject中,可以统一对所有的module进行清理、编译、打包

20170210150904469.png

6、要运行依赖中的module,则必须要将module中的Jar包,打到maven中,需要使用install
下面,是我将所有module中的Jar打到Maven中的路径:

20170210151128014.png

3、建立Project和建立module
1、只需要建立一个项目,其他项目由module建立,所有module且放在项目中。

2、本文项目为yhproject,其余都为module,分别是:mainEntrance、yhutils、yhapp、yhweb、yhgame
项目建立步鄹:

20170210141838082.png

20170210141846773.png

20170210141854241.png

20170210141900380.png

Module建立步鄹:

20170210141906802.png

20170210141917757.png

20170210141937632.png

项目、所有module、部分module代码展示:

20170210142038585.png

20170210143934908.png

4、项目之前的依赖关系

20170210144326394.png


5、代码展示
mainEntrance

package com.yh.bi.dag

[mw_shl_code=java,true]package com.yh.bi.dag

/**
  * Created by yuhui on 2017/2/10.
  */
import java.time.{Duration, LocalDate}
import com.yh.bi._
import com.yh.bi.{UserAPP, UserGame, UserWEB}
import org.slf4j.LoggerFactory

import scala.collection.immutable.{ListMap, ListSet}

/**
  * Created by yuhui on 2016/8/25.
  * task --> Node --> DAG --> DAGExecutor
  */

case class Node[T](task: T, parent: T*) {
  override def toString: String = {
    s"$task(${parent.mkString(",")})"
  }
}

case class DAG[T](nodes: Node[T]*)

case class DAGExecutor[T](dag: DAG[T]) {
  private val LOG = LoggerFactory.getLogger(this.getClass)
  private val _nodes: Map[T, Seq[T]] = dag.nodes.map(node => (node.task, node.parent.filter(_ != null))).toMap
  private var _pending: Set[T] = ListSet()
  private var _fails = ListMap[T, String]()
  private var _success = Seq[T]()

  //判断Node的task节点的父节点运行状态(flase ,true)
  private def getPending: Option[T] = {
    _pending.find { name =>
      val parents = _nodes(name)
      !parents.exists(name => !_success.contains(name))
    }
  }

  private def fail(name: T, message: String): Unit = {
    _pending -= name
    _fails += name -> message
    for (child <- _pending.filter(child => _nodes(child).contains(name))) {
      fail(child, s"依赖的任务无法执行: $name")
    }
  }

  private def success(name: T): Unit = {
    _pending -= name
    _success = _success :+ name
  }

  def execute(func: T => Unit): Unit = {
    _pending = _nodes.keySet
    _fails = ListMap()
    _success = Seq()
    var running = true

    while (running) {
      val taskOpt = getPending
      if (taskOpt.nonEmpty) {
        val task = taskOpt.get
        val startMills = System.currentTimeMillis()
        LOG.info("start task {}", task)
        try {
          println("=============")
          func(task)  //执行executor方法
          println("+++++++++++++")
          val time = Duration.ofMillis(System.currentTimeMillis() - startMills)
          LOG.info(s"end task $task time=$time")
          success(task)
        } catch {
          case e: Throwable => fail(task, e.getMessage)
            LOG.error(e.getMessage, e)
            LOG.info(s"fail task $task")
        }
      } else {
        running = false
      }
    }

    for (name <- _success) {
      LOG.info(s"success task: $name")
    }
    for (name <- _fails) {
      LOG.info(s"fail task: ${name._1} - ${name._2}")
    }
  }
}

object DAG {
  val allSDKDAG = new DAG[Task](
    Node(UserAPP),
    Node(UserGame),
    Node(UserWEB)
  )

  def main(args: Array[String]): Unit = {
    DAGExecutor(allSDKDAG).execute { task =>task.executor("appkey": String, LocalDate.now(), LocalDate.now())}
  }
}[/mw_shl_code]

yhutils

com.yh.bi

[mw_shl_code=java,true]package com.yh.bi

/**
  * Created by yuhui on 2017/2/10.
  */
import java.time.LocalDate
import org.apache.spark.sql.SQLContext
import org.slf4j.LoggerFactory

abstract class Executor extends Task with SQLContextAware {

  override def run(appkey: String, startDay: LocalDate, endDay: LocalDate)={}

}

trait SQLContextAware {
  implicit var ctx: SQLContext = _
}


abstract class Task {

  protected val LOG = LoggerFactory.getLogger(this.getClass)

  def executor(appkey: String, startDay: LocalDate, endDay: LocalDate): Unit

  def run(appkey: String, startDay: LocalDate, endDay: LocalDate): Unit = {
    executor(appkey, startDay, endDay)
  }

}[/mw_shl_code]

yhapp

com.yh.bi

[mw_shl_code=java,true]package com.yh.bi

/**
  * Created by yuhui on 2017/2/10.
  */
import java.time.LocalDate

object UserAPP extends Executor{

  override def executor(appkey: String, startDay: LocalDate, endDay: LocalDate): Unit = {

    println("++++我的UserAPP的执行过程++++")

  }

}[/mw_shl_code]

yhweb

com.yh.bi

[mw_shl_code=java,true]package com.yh.bi

import java.time.LocalDate

object UserWEB extends Executor{

  override def executor(appkey: String, startDay: LocalDate, endDay: LocalDate): Unit = {

    println("++++我的UserWEB的执行过程++++")

  }

}[/mw_shl_code]

yhgame

com.yh.bi

[mw_shl_code=java,true]package com.yh.bi

/**
  * Created by yuhui on 2017/2/10.
  */
import java.time.LocalDate

object UserGame extends Executor{

  override def executor(appkey: String, startDay: LocalDate, endDay: LocalDate): Unit = {

    println("++++我的UserGame的执行过程++++")

  }

}[/mw_shl_code]

6、项目中POM依赖展示
yhproject中POM文件展示:

[mw_shl_code=xml,true]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yh.bi</groupId>
    <artifactId>yhproject</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>

    <modules>
        <module>mainEntrance</module>
        <module>yhapp</module>
        <module>yhweb</module>
        <module>yhgame</module>
        <module>yhutils</module>
    </modules>
</project>[/mw_shl_code]

mainEntrance中POM文件展示:

[mw_shl_code=xml,true]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>mainEntrance</artifactId>
    <groupId>com.yh.bi</groupId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <artifactId>yhutils</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <!--<scope>provided</scope>  //本机调试则注释,  集群运行则解开-->
        </dependency>

        <dependency>
            <artifactId>yhapp</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <!--<scope>provided</scope>-->
        </dependency>

        <dependency>
            <artifactId>yhgame</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <!--<scope>provided</scope>-->
        </dependency>

        <dependency>
            <artifactId>yhweb</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <!--<scope>provided</scope>-->
        </dependency>
    </dependencies>

</project>[/mw_shl_code]

yhutils中POM文件展示:

[mw_shl_code=xml,true]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>yhproject</artifactId>
        <groupId>com.yh.bi</groupId>
        <version>1.0</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>yhutils</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.11</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
</project>[/mw_shl_code]

yhapp中POM文件展示:

[mw_shl_code=xml,true]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yh.bi</groupId>
    <artifactId>yhapp</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <artifactId>yhutils</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>[/mw_shl_code]

yhweb中POM文件展示:

[mw_shl_code=xml,true]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yh.bi</groupId>
    <artifactId>yhweb</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <artifactId>yhutils</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>[/mw_shl_code]

yhgame中POM文件展示:

[mw_shl_code=xml,true]<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yh.bi</groupId>
    <artifactId>yhgame</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <artifactId>yhutils</artifactId>
            <groupId>com.yh.bi</groupId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>[/mw_shl_code]

7、运行结果展示
注意:我在mainEntrance执行DAG中的main文件,可以调用且执行了yhutils、yhapp、yhweb、yhgame中的代码

20170210150600093.png



来源:csdn
作者:silentwolfyh

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条