我正在尝试开始使用Scalatra,但我遇到了SBT的主要问题。说白了,我讨厌它。它是Maven的Scala等价物。它试图接管您项目的每个方面,以获得一些所谓的好处。此外,它没有很好地与IDE集成。那么有没有一种方法可以在没有SBT的情况下使用Scalatra?我非常喜欢Scalatra提供的东西,但是如果我不能摆脱SBT,我可能不得不解决一些更糟糕的问题,比如用Jetty构建我需要的功能。
答案 0 :(得分:8)
我应该更清楚一点。但是昨晚几个小时后,我找到了答案。首先,你需要一个像这样(或类似)的主要对象:
object Sandbox {
def main(args: Array[String]) {
val server = new Server(3000)
val context = new WebAppContext()
context.setServer(server)
context.setContextPath("/")
context.setWar("webapp")
server.setHandler(context)
try {
server.start()
server.join()
} catch {
case e: Exception =>
e.printStackTrace()
System.exit(-1)
}
}
}
然后你需要一个servlet:
class Test extends ScalatraServlet with ScalateSupport {
get("/") {
<html>
<body>
Hello World
</body>
</html>
}
}
您还需要默认包中的ScalatraBootstrap类(必须命名为ScalatraBootstrap.scala
:
class ScalatraBootstrap extends LifeCycle {
override def init(context: ServletContext) {
context.mount(new Test, "/test/*")
}
}
几乎完成了。您将需要一个XML文件。创建一个webapp/WEB-INF
文件夹并将此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_3_0.xsd"
version="3.0">
<listener>
<listener-class>org.scalatra.servlet.ScalatraListener</listener-class>
</listener>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/img/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/js/*</url-pattern>
<url-pattern>/assets/*</url-pattern>
</servlet-mapping>
</web-app>
最后,您需要JAR文件。有一个很长的列表,但有一个相当简单的方法来获得它们。我讨厌Maven,但我喜欢依赖管理。因此,在某处创建一个测试文件夹,然后在this repo中下载pom.xml
文件。然后转到pom.xml
所在的文件夹并运行mvn dependency:copy-dependencies
。从dependencies
文件夹中抓取JAR,你就可以了。没有Maven,没有SBT,没有魔法。像往常一样在IDE中运行和调试。 :)