【问题标题】:Running web app in both Jetty and Tomcat在 Jetty 和 Tomcat 中运行 Web 应用程序
【发布时间】:2011-06-16 08:56:19
【问题描述】:

我有一个在 Tomcat 上运行的网络应用程序。它使用 MySQL 连接器,但它没有与 war 捆绑在一起,而是包含在 Tomcat 的公共 lib 目录下,以便我可以通过 JNDI 访问数据源。

我想对 Jetty 做一些类似的事情(在开发时),更准确地说是 Jetty + Maven。在通过 Maven 运行 Jetty 时,我有没有办法在类路径中包含 mysql-connector jar(即没有将它捆绑在 war 文件中)?

另外我应该注意,我在构建过程中使用 Maven,并将 mysql-connector 指定为“提供”范围。

【问题讨论】:

  • 您找到解决问题的方法了吗?
  • @Imran 如果有任何答案解决了您的问题,请单击大的空白复选框将其标记为已接受。这将问题标记为已解决。

标签: java tomcat maven jetty jndi


【解决方案1】:

不直接回答您的问题,但由于我喜欢 webapps 中的可移植性,我的战争将包含连接器 jar 和连接池(例如超级骗子 c3p0)。这意味着容器将不再为我管理数据库连接,我也不会使用 JNDI 来描述连接属性。但是 webapp 现在在 tomcat、jetty、resin、jboss 等上是 100% 可移植和可预测的。

【讨论】:

  • 但 OP 不想打包连接器 jar。否则,这很容易。
  • @Nishant:是的,我在回答中提到了这一点。它可能会添加有用的信息,否则我可以简单地删除答案。
  • 请不要删除。我不是有意冒犯(如果你有这种感觉,我很抱歉)。这确实是一个不错的选择。
  • @Nishant:无意冒犯。我只是想补充一些我过去经历过的事情。如果它变得离题、被否决或被标记,我可以简单地删除它。
  • Tomcat 7 会在你的战争档案中有 mysql-connector-java 时发出警告。
【解决方案2】:
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New class="org.mortbay.jetty.plus.naming.Resource">
    <Arg>hd-props</Arg>
    <Arg>
        <New class="java.util.Properties">
            <Call name="load">
                <Arg>
                    <New class="java.io.FileReader">
                        <Arg>cfg/dev-local.properties</Arg>
                    </New>
                </Arg>
            </Call>
        </New>
    </Arg>
</New>

它是一个 jetty-env.xml,指向 .properties 文件,该文件包含所有连接到 DB 的参数。

    <bean id="jndi" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/hd-props"/>
    </bean>
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="properties" ref="jndi"/>
    </bean>

这是一个弹簧配置(我也在使用弹簧)

然后,我调用 mvn jetty:run,它运行良好...

【讨论】:

  • 你的 MySQL 依赖是否说 provided?
  • 老实说,我使用的是 postgres 而不是 mysql,但您在这种情况下使用的 db 似乎没有什么区别。不,它有一个编译范围……这有关系吗?
  • 是的,实际上compile 范围内的工件与war 打包在一起,而provided 标记的工件不是。并且,应该提供这些工件的环境(在本例中为应用服务器)。一个这样的工件是servlet,因为所有应用服务器都提供了自己的实现。
  • 哦,我明白了.. 我刚刚试了一下,谢谢你的想法.. 似乎我没有正确理解问题
  • 感谢大家的回复。我遇到的问题实际上更多地与tomcat有关,然后是码头。因此,当我包含一个 jar 甚至不一定是 mysql-connector(在我的情况下,它是一个自定义 jar 文件,其中包含我为管理配置而定义的一些类),当我尝试在 tomcat 中运行它时,你会得到奇怪的行为。这是因为来自不同 jar 的 2 个类实际上被 spring 处理不同,因此我不能
【解决方案3】:

除了上一个答案: 您必须在 Maven 配置依赖项中添加到您的码头插件:

<plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>${jetty.version}</version>
            <configuration>
                <stopKey>blah-blah-blah</stopKey>
                <stopPort>9966</stopPort>
                <webAppConfig>
                    <contextPath>/</contextPath>
                </webAppConfig>
                <jettyEnvXml>${basedir}/src/jetty-env.xml</jettyEnvXml>
            </configuration>
            <dependencies>              
                <dependency>
                    <groupId>postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                    <version>8.4-701.jdbc4</version>
                </dependency>
            </dependencies>
        </plugin>

然后您可以在主要项目依赖项中使用提供的范围。我现在就这样做了,它有效。谢谢你的问题(还有 Nishant)

【讨论】:

  • 也这样做了,基于this,可以确认它工作;)
【解决方案4】:

也许您可以尝试使用 Maven .war overlays 来实现此目的,但我不知道它们是否适用于其他依赖项。

所以基本上你的项目是

parent
|---- original-war
|---- new-war

您的原始战争项目的mysql依赖项为&lt;scope&gt;provided&lt;/scope&gt;,但新战争模块只是一个具有&lt;packaging&gt;war&lt;/packaging&gt;的pom,取决于原始战争(用于覆盖)具有mysql依赖项编译范围,并运行 jetty 插件(将 jetty 插件排除在 original-war 模块之外)。如果这可行,那么您将不得不处理在一个模块中进行开发但在另一个模块中在 maven 中进行的任何测试的轻微不便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2012-08-04
    • 1970-01-01
    • 2013-02-20
    • 2011-12-07
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多