【问题标题】:Is there a GWT Maven project structure, that doesn't mix up responsibilities?是否有不混淆职责的 GWT Maven 项目结构?
【发布时间】:2013-02-22 10:54:24
【问题描述】:

我刚刚开始使用 Maven 作为构建系统进行 GWT 开发。

我来自 Java + Flex 世界,所以我自然而然地拥有完全分离的客户端模块和服务器端模块。

在深入研究 GWT 的最佳实践并不断深入研究的同时,对我来说,GWT 项目的默认配置越来越像是一堆乱七八糟的职责。尤其是涉及到多模块项目时。

我确实明白,约定规定服务器端逻辑属于“服务器”包,共享代码属于“共享”,以及由 GWT 编译器在“客户端”包中编译为 HTML+JavaScript 的内容。所有代码都转到 src/main/java。到目前为止一切顺利。

无论我怎么看……对我来说,“客户端”包中的东西都只是死代码。即使 java 编译器将其编译为类,这些类也不会在运行时使用,并且只需要在编译阶段向 GWT 编译器提供输入。因此,即使它看起来像 Java,它实际上也不是而且只是看起来像 Java。将这些与“实时”代码放在同一个 jar 中感觉有点脏。

这样的 maven 结构不是更有意义吗:

/src/
/src/main/
/src/main/java
/src/main/shared
/src/main/gwt

让 java-compiler-plugin 使用 src/main/java 和 src/main/shared 并让 GWT 编译器使用 src/main/gwt 和 src/main/shared?

此外,如果构建会产生两种类型的工件,感觉会好很多……普通的“jars”包含来自 src/main/java 和 src/main/shared 的类和第二个“gwt”,它包含类以及 src/main/gwt 和 src/main/shared 的来源。

我不会向一些混淆的 jar 添加依赖项,但可以决定是要导入一些 GWT 组件还是要导入一些服务器端功能。

接下来的事情是,GWT 默认是将 xml、资源和其他东西放在 src/main/java ... XML && Resources != Java ;-)

或者这一切有什么真正的原因,我根本还没有意识到……还是我只是不得不开始变得肮脏而不担心这样的事情?

克里斯

【问题讨论】:

    标签: java gwt maven


    【解决方案1】:

    不久前我得出了同样的结论,并创建了几个原型来帮助入门:https://github.com/tbroyer/gwt-maven-archetypes (announcement)。

    那些原型仍然有*.gwt.xml 等。放入src/main/java,因为 Google Plugin for Eclipse 不支持将它们放在其他任何位置(我听说它已在最近的版本中修复,但尚未检查)。

    【讨论】:

    • 我猜如果 gwt-maven-plugin 被扩展以提供(例如)“gwt”的自定义包装类型,那么一个真正干净的解决方案将是。在这样的 gwt-artifact 中,我可以依赖于 jar 和 gwt 工件,并且默认代码位置将是(例如)src/main/gwt。在这种情况下,我不能混淆 GWT 伪 jar 和真正的 Java jar,但我可以从 GWT 引用真正的 Java 代码。我的服务器类路径中没有死类。任何人都会立即看到它实际上是 GWT 代码。
    • 我正在做这样的事情(如果你想要的话,我的 GitHub 上的早期原型)。不过,您仍然不会在同一个 Maven 模块中混合客户端和服务器(考虑一下:GWT 需要源代码和编译的类,因此您需要调用 javac,最好是通过 maven-compiler-plugin,使用不同的源代码path –easy– 和类路径作为您的服务器端;一些服务器端组件与 GWT 编译器或 DevMode 之间也存在不兼容性,因此您需要将一些 deps 隔离为仅服务器,而将其他一些 deps 隔离为共享;那是不是Maven的做事方式,只是拆分模块)
    • 嘿...我很高兴将这两件事分开 :-) 那么随着您的更改,是否会有带有 gwt 工件和 jar 工件的设置?这会很棒。刚刚查看了您的 github 存储库……嗯,这确实是一个“早期原型”;-)
    • 我们谈论的是从 Maven 依赖项自动生成 <inherits/>;一个未解决的大问题是在哪里放置gwt:compile? (在client 模块中使用特殊的gwt-app 包装——类似于我的原型——或者在server 模块中使用scope=gwt 依赖项;后者至少会使运行DevMode 更容易,但前者仅限客户端的应用程序可能也需要)
    • 哎……如果我们能联手就太好了。我很乐意为 GWT 和 Maven 清洁工作做出贡献。
    【解决方案2】:

    我还尝试将 GWT 客户端代码与服务器端代码分开。我使用的方法是拥有一个包含 2 个子项目的顶级项目,一个用于服务器端,一个用于客户端。顶级项目有一个 pom.xml,其中包含每个子项目的元素。

    客户端项目在 src/main/java 中包含 GWT java 源代码,在 src/main/webapp 中包含其余的 webapp 文件。服务器端项目只包含服务器端代码。

    可能不是最整洁的解决方案,但至少有更清晰的分离。

    【讨论】:

    • 我只是在讨论一个场景,其中我的服务器包中有一个 Sample Singleton,并且很容易从客户端代码调用一个方法。所以对我来说,cleanes soultion 将是 3 个项目(客户端、共享、服务器)......但我想这会极大地破坏事情。
    • 我从不打扰共享,我不喜欢 GWT RMI,太混乱了。我只是将 XML 用于客户端/服务器通信。 GWT 有 xml 处理。
    猜你喜欢
    • 2011-07-18
    • 2013-02-04
    • 2011-03-17
    • 1970-01-01
    • 2022-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2011-08-20
    相关资源
    最近更新 更多