提问者:小点点

如何使用Maven设置一个工作的Vaadin项目并使用Jetty运行它?


我在os x机器上安装了maven:

$ mvn --version 
Apache Maven 3.2.3 
Java version: 1.8.0_25, 
vendor: Oracle Corporation 
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "mac os x", version: "10.10.1", arch: "x86_64", family: "mac"

我尝试了几个教程,环顾四周SO:

  • https://vaadin.com/book/-/page/getting-started.maven.html
  • https://vaadin.com/wiki/-/wiki/Main/Creating一个Maven项目
  • http://www.maxpagels.com/tutorials/vaadin-tutorial/
  • 404在一个简单的码头/Maven Hello World webapp中未找到错误

但是我还不能在jetty maven插件上设置一个可运行的Vaadin项目。我的问题是在jetty Web服务器上找不到该项目,我总是收到404未找到错误。

以下是我做的步骤:

$ cd ~
$ mkdir Maven
$ cd Maven
$ mvn archetype:generate \
   -DarchetypeGroupId=com.vaadin \
   -DarchetypeArtifactId=vaadin-archetype-application \
   -DarchetypeVersion=7.3.9 \
   -Dpackaging=war
... 
[INFO] Archetype repository missing. Using the one from [com.vaadin:vaadin-archetype-application:7.3.9] found in catalog remote
    Define value for property 'groupId': : com.example
    Define value for property 'artifactId': : hello-world
    Define value for property 'version':  1.0-SNAPSHOT: : 1.0
    Define value for property 'package':  com.example: : 
    [INFO] Using property: themeName = mytheme
    [INFO] Using property: uiName = MyUI
    [INFO] Using property: widgetsetName = MyAppWidgetset
    Confirm properties configuration:
    groupId: com.example
    artifactId: hello-world
    version: 1.0
    package: com.example
    themeName: mytheme
    uiName: MyUI
    widgetsetName: MyAppWidgetset
     Y: : Y
     ...
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 56.332 s
    [INFO] Finished at: 2015-01-27T12:03:42+03:00
    [INFO] Final Memory: 15M/245M
    [INFO] ------------------------------------------------------------------------
$ cd hello-world
$ mvn package
    ...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:00 min
[INFO] Finished at: 2015-01-27T12:08:56+03:00
[INFO] Final Memory: 21M/247M
[INFO] ------------------------------------------------------------------------
$

然后我输入mvn jetty: run命令:

$ mvn jetty:run

这给出了这个错误:

Maven:在当前项目中没有找到前缀“jetty”的插件

所以我在~/. m2目录中添加了一个settings.xml文件:

~/. m2/settings.xml:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <pluginGroups>
    <pluginGroup>org.mortbay.jetty</pluginGroup>
    </pluginGroups>
</settings>

并键入mvn jetty:再次运行:

$ mvn jetty:run
...
[INFO] Configuring Jetty for project: hello-world-parent
[INFO] webAppSourceDirectory not set. Defaulting to /Users/me/Maven/hello-world/src/main/webapp
[INFO] Reload Mechanic: automatic
[INFO] Classes directory /Users/me/Maven/hello-world/target/classes does not exist
[INFO] Context path = /
[INFO] Tmp directory = /Users/me/Maven/hello-world/target/tmp
[INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml
[INFO] Web overrides =  none
[INFO] web.xml file = null
[INFO] Webapp directory = /Users/me/Maven/hello-world/src/main/webapp
2015-01-27 12:11:28.610:INFO:oejs.Server:jetty-8.1.16.v20140903
2015-01-27 12:11:29.121:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one.
2015-01-27 12:11:31.038:WARN:oejsh.RequestLogHandler:!RequestLog
2015-01-27 12:11:31.155:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server

现在你可以看到jetty启动了,但是当我在http://localhost:8080/打开浏览器时,我得到一个404未找到:访问 /.问题原因:未找到。我已经尝试了以下URL之一:

  • http://localhost:8080/
  • http://localhost:8080
  • http://localhost:8080/hello-world
  • http://localhost:8080/hello-world/
  • http://localhost:8080/hello-world-parent/
  • http://localhost:8080/hello-world-parent
  • http://localhost:8080/webapp
  • http://localhost:8080/webapp/

没有人为我工作(我总是找不到404)。

现在,为什么他们在留档中说,如果你按照我上面所做的步骤:

瓦丁之书:

然后,您可以在http://localhost:8080/project-name.在网络浏览器中打开它

项目名称是给maven生成目标的artifactId参数,我的是artifactId: hello-world,但正如我所说http://localhost:8080/hello-world不适合我(404未找到)。

我也在阅读Vaadin 7 CookBook,这里他们说:

我们完成了,我们可以运行我们的新Web应用程序。转到pom. xml文件所在项目的根目录并运行以下命令。mvn jetty:start应用程序将在http://localhost:8080上运行

什么???http://localhost:8080没有“项目名称”后缀???我已经试过了,但是我仍然没有找到404,不管怎样…

那么,有没有人可以解释一下发生了什么,以及我如何解决这个令人沮丧的问题,以便最终开始与Vaadin一起开发?

感谢您的关注。


共1个答案

匿名用户

我猜你遇到了一个问题,其中说明是针对旧原型版本的,其中原型的一个月左右前更新为新版本,但说明谈到了旧版本。最大的区别是原型被制作成一个多模块项目,而旧原型是一个单模块项目。

许多人在使用多模块项目时遇到了问题,因此当前原型可能会在不久的将来重命名为其他名称,并且在当前命名空间中,相同的项目将减少到单个模块项目,以便更容易上手。然而,在此之前,您必须学习使用多模块项目。

如果您查看文件夹内部,您应该在hello-world文件夹中有一组文件夹。那里的每个文件夹都有一个模块:

  • hello-world-用户界面-实际UI项目所在的代码
  • hello-world-widgetset-将使用GWT从Java编译为JavaScript的代码。-用户界面取决于此项目
  • hello-world-生产-用户界面的缩小版本,用于将应用程序部署到正式服中。这纯粹是性能提升的小优化。
  • 和本身是模块的根文件夹,hello-world父。

首先,您应该删除您添加到settings. xml的内容。Jetty应该在应该使用它的项目的pom.xml中定义。现在您全局定义了它,以便它适用于所有项目,也适用于那些不能在Jetty上运行的项目。

为了能够运行该软件,您必须做两件事,构建整个软件并启动-用户界面模块。

  1. 当您在根文件夹中调用mvn install时,就会发生构建。您也可以仅在-widgetset文件夹中执行此操作,但重要的是-widgetset会被构建并安装到您的本地maven存储库中,以便-用户界面在需要时可以找到它。在root上调用mvn install将导致它以正确的顺序单独调用所有子模块。
  2. 通过进入hello-world-用户界面并在那里调用mvn jetty: run来启动UI。-用户界面项目中的pom.xml定义了一个jetty依赖项。

关于URL中的项目名称后缀。由servlet容器(其中Jetty是一个,Tomcat,Wildfly等是其他)决定是否在特定URL下部署它。Jetty是一个简单的servlet容器,您只需在需要时为项目启动它,因此http://localhost:8080/就可以了。Tomcat和其他更大的容器更适合生产,您可以一次在一个Tomcat实例中部署许多项目(战争),因此它需要通过将项目名称添加到url中来分隔它们,即hello-world-用户界面