搭建Eclipse+Maven+Scala-IDE的Scala Web开发环境


江湖传闻,scala开发的最佳利器乃 JetBrains 的神作 IntelliJ IDEA ,外加构建工具 sbt 是也。

但因历史原因,项目组成员对 Eclipse + Maven 组合更为熟悉,为了快速实现项目原型,不增加不确定因素带来的风险,搭建一套 Eclipse + Maven + Scala-IDE 的开发环境。

基本原则是,必须完全满足但不限于以下几点内容:

方便重构,方便调试,支持热部署。

可直接使用已有maven的本地和私服仓库。

可以无束缚的只用自己熟悉的语言编写代码。

可以快速混合编译scala+java代码,包括交叉引用的文件。

如果你有洁癖,可以自己下载 Eclipse ,然后安装各种插件。但是可能会遇到插件依赖包版本冲突之类的问题,为了速度,我直接下载官方打包好的 Scala-IDE ,有各种平台可供选择。

使用 Git 管理项目源代码,需要安装 EGit 插件,Eclipse插件更新地址 EGit Updates 。

假设项目名称为 feeling ,使用 JDK 1.7,Servlet 3.0,最终目录结构如下。

.
├── .settings                    #eclipse工程目录
├── .classpath                  #eclipse classpath文件
├── .project                    #eclipse project文件
├── src                          #源代码
|  ├── main                    #源代码主目录
|  |  ├── java                #java代码
|  |  ├── scala                #scala代码
|  |  ├── resources            #资源文件
|  |  └── webapp              #web主目录
|  |      ├── WEB-INF          #WEB-INF目录
|  |      |  └── web.xml      #web.xml文件
|  |      └── index.jsp        #主页面
|  └── test                    #测试代码
|      ├── java                #java测试代码
|      ├── scala                #scala测试代码
|      └── resources            #测试资源文件
├── .gitignore                  #git忽略配置
├── target                      #编译输出目录
├── README.md                    #markdown格式的说明文件
└── pom.xml                      #maven的pom文件

pom.xml文件

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>feeling</groupId>
  <artifactId>feeling</artifactId>
  <version>0.0.1</version>
  <packaging>war</packaging>

  <!-- <name>${project.artifactId}</name> -->
  <name>feeling</name>
  <description>our wonderfully feeling application</description>
  <url>http://feeling.com</url>
  <inceptionYear>2014</inceptionYear>

  <organization>
    <name>feeling</name>
    <url>http://feeling.com</url>
  </organization>

  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <id>bruce</id>
      <name>bruce sha</name>
      <url>http://bruce-sha.github.io</url>
      <email>bu.ru@qq.com</email>
    </developer>
  </developers>

  <scm>
   <connection>http://17.20.13.23/scm/git/feeling</connection>
   <developerConnection>http://17.20.13.23/scm/git/feeling</developerConnection>
   <url>http://17.20.13.23</url>
  </scm>

  <properties>
    <scala.version>2.10.3</scala.version>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <encoding>UTF-8</encoding>
  </properties>

  <!-- 个性化开发 -->
  <profiles>
    <profile>
      <id>dev</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <build.param>this is dev</build.param>
      </properties>
    </profile>
    <profile>
      <id>release</id>
      <activation>
        <activeByDefault>false</activeByDefault>
      </activation>
      <properties>
        <build.param>this is relase</build.param>
      </properties>
    </profile>
  </profiles>

  <dependencies>

    <!-- google -->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>15.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>3.0</version>
    </dependency>

    <!-- servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <!-- <version>2.5</version> -->
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>

    <!-- <dependency> -->
    <!-- <groupId>javax.servlet</groupId> -->
    <!-- <artifactId>jsp-api</artifactId> -->
    <!-- <version>2.0</version> -->
    <!-- <scope>provided</scope> -->
    <!-- </dependency> -->

    <!-- scala -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>

    <!-- test -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!-- 其他包不再一一描述 -->   
    <!-- log -->
    <!-- json -->
    <!-- mongodb -->
    <!-- quartz -->

  </dependencies>

  <build>
    <finalName>feeling</finalName>

    <!-- 必须要,资源文件中占位符被profile替换的关键配置 -->
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>*.*</include>
        </includes>
        <filtering>true</filtering>
      </resource>
    </resources>

    <!-- 必须干掉,否则不编译src/main/java下的代码 -->
    <!-- <sourceDirectory>src/main/scala</sourceDirectory> -->
    <!-- <testSourceDirectory>src/test/scala</testSourceDirectory> -->
    <plugins>
      <plugin>
        <!-- see http://davidb.github.com/scala-maven-plugin -->
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.1.6</version>
        <!-- 必须要,否则不能混合编译交叉引用文件 -->
        <executions>
          <execution>
            <id>scala-compile-first</id>
            <phase>process-resources</phase>
            <goals>
              <goal>add-source</goal>
              <goal>compile</goal>
            </goals>
          </execution>
          <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.13</version>
        <configuration>
          <useFile>false</useFile>
          <disableXmlReport>true</disableXmlReport>
          <!-- If you have classpath issue like NoDefClassError,... -->
          <!-- useManifestOnlyJar>false</useManifestOnlyJar -->
          <includes>
            <include>**/*Test.*</include>
            <include>**/*Suite.*</include>
          </includes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <!-- 移除web.xml的依赖,Servlet 3.0可以不要web.xml文件 -->
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>

      <!-- jetty6,不支持servlet3 -->
      <!-- <plugin> -->
      <!-- <groupId>org.mortbay.jetty</groupId> -->
      <!-- <artifactId>maven-jetty-plugin</artifactId> -->
      <!-- <version>6.1.26</version> -->
      <!-- <configuration> -->
      <!-- <scanIntervalSeconds>10</scanIntervalSeconds> -->
      <!-- <stopKey>foo</stopKey> -->
      <!-- <stopPort>9999</stopPort> -->
      <!-- </configuration> -->
      <!-- <executions> -->
      <!-- <execution> -->
      <!-- <id>start-jetty</id> -->
      <!-- <phase>pre-integration-test</phase> -->
      <!-- <goals> -->
      <!-- <goal>run</goal> -->
      <!-- </goals> -->
      <!-- <configuration> -->
      <!-- <scanIntervalSeconds>0</scanIntervalSeconds> -->
      <!-- <daemon>true</daemon> -->
      <!-- </configuration> -->
      <!-- </execution> -->
      <!-- <execution> -->
      <!-- <id>stop-jetty</id> -->
      <!-- <phase>post-integration-test</phase> -->
      <!-- <goals> -->
      <!-- <goal>stop</goal> -->
      <!-- </goals> -->
      <!-- </execution> -->
      <!-- </executions> -->
      <!-- </plugin> -->

      <!-- tomcat7:run 注意tomcat:run跑的是6,不支持servlet3 -->
      <plugin>
        <!-- http://tomcat.apache.org/maven-plugin-2.0/tomcat7-maven-plugin -->
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <path>/</path>
          <port>80</port>
        </configuration>
      </plugin>

      <!-- jetty:run -->
      <plugin>
        <!-- http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin -->
        <groupId>org.mortbay.jetty</groupId>
        <!-- <artifactId>maven-jetty-plugin</artifactId> 这是jetty6 不支持servlet3 -->
        <artifactId>jetty-maven-plugin</artifactId>
        <version>8.1.13.v20130916</version>
        <configuration>
          <stopPort>9966</stopPort>
          <stopKey>foo</stopKey>
          <scanIntervalSeconds>0</scanIntervalSeconds>
          <connectors>
            <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
              <port>80</port>
              <maxIdleTime>60000</maxIdleTime>
            </connector>
          </connectors>
          <webAppConfig>
            <contextPath>/</contextPath>
          </webAppConfig>
        </configuration>
      </plugin>

    </plugins>
  </build>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- <web-app -->
<!-- xmlns="http://java.sun.com/xml/ns/javaee" -->
<!-- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -->
<!-- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" -->
<!-- version="2.5" -->
<!-- > -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="WebApp_ID" version="3.0">

  <display-name>feeling</display-name>

  <!--  <servlet> -->
  <!--  <servlet-name>feeling</servlet-name> -->
  <!--  <servlet-class>feelings.service.FeelingService</servlet-class> -->
  <!--  </servlet> -->

  <!--  <servlet-mapping> -->
  <!--  <servlet-name>feeling</servlet-name> -->
  <!--  <url-pattern>/feeling</url-pattern> -->
  <!--  </servlet-mapping> -->
 
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
</web-app>

.project文件:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
  <name>feeling</name>
  <comment></comment>
  <projects>
  </projects>
  <buildSpec>
    <buildCommand>
      <name>org.scala-ide.sdt.core.scalabuilder</name>
      <arguments>
      </arguments>
    </buildCommand>
    <buildCommand>
      <name>org.eclipse.m2e.core.maven2Builder</name>
      <arguments>
      </arguments>
    </buildCommand>
  </buildSpec>
  <natures>
    <nature>org.scala-ide.sdt.core.scalanature</nature>
    <nature>org.eclipse.jdt.core.javanature</nature>
    <nature>org.eclipse.m2e.core.maven2Nature</nature>
  </natures>
</projectDescription>

.classpath文件:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
  <classpathentry kind="src" output="target/classes" path="src/main/java">
    <attributes>
      <attribute name="optional" value="true"/>
      <attribute name="maven.pomderived" value="true"/>
    </attributes>
  </classpathentry>
  <classpathentry kind="src" output="target/classes" path="src/main/scala">
    <attributes>
      <attribute name="optional" value="true"/>
      <attribute name="maven.pomderived" value="true"/>
    </attributes>
  </classpathentry>
  <classpathentry including="**/*.java" kind="src" path="src/main/resources"/>
  <classpathentry kind="src" output="target/test-classes" path="src/test/java">
    <attributes>
      <attribute name="optional" value="true"/>
      <attribute name="maven.pomderived" value="true"/>
    </attributes>
  </classpathentry>
  <classpathentry kind="src" output="target/test-classes" path="src/test/scala">
    <attributes>
      <attribute name="optional" value="true"/>
      <attribute name="maven.pomderived" value="true"/>
    </attributes>
  </classpathentry>
  <classpathentry including="**/*.java" kind="src" path="src/test/resources"/>
  <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/>
  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
    <attributes>
      <attribute name="maven.pomderived" value="true"/>
    </attributes>
  </classpathentry>
  <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
      <attribute name="maven.pomderived" value="true"/>
    </attributes>
  </classpathentry>
  <classpathentry kind="output" path="target/classes"/>
</classpath>

使用IntelliJ IDEA编写Scala在Spark中运行

Scala编程完整中文版 PDF

快学Scala (中文完整扫描版) PDF 

Ubuntu 安装 2.10.x版本的Scala 

Spark1.0.0部署指南

CentOS 6.2(64位)下安装Spark0.8.0详细记录

Spark简介及其在Ubuntu下的安装使用

安装Spark集群(在CentOS上)

Hadoop vs Spark性能对比

Spark安装与学习

Spark 并行计算模型

Scala 的详细介绍:请点这里
Scala 的下载地址:请点这里

本文永久更新链接地址

相关内容