【问题标题】:How to properly include Java sources in Maven?如何在 Maven 中正确包含 Java 源?
【发布时间】:2012-01-04 16:23:33
【问题描述】:

我正在使用 Java 开发一个非常简单的博客引擎,以便学习多种技术。

技术:Spring IoC、Hibernate、jUnit、GWT 和 Maven。

我创建了两个 Maven 项目:一个核心项目和一个 GWT 项目(在核心项目上有一个参考)

代码可通过https://github.com/LaurentT/BlogEngineCore访问

我的目标如下:我想包含 Java 源代码和 XML,因为我的 GWT 项目需要 Java 源代码才能将其编译成 JavaScript。

我尝试在<build> 元素中使用以下代码:

     <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*xml</include>
                <include>**/*.*properties</include>
            </includes>
        </resource>
    </resources>

我的 jUnit 测试曾经在添加之前通过并完成,但现在他们甚至没有完成他们正在挂起......

我不知道发生了什么,所以我想知道是否有其他方法可以包含 Java 源代码,或者我是否只是做错了。

有什么线索吗?

【问题讨论】:

  • 您为什么认为“junit 测试挂起”与包含 java 源代码有关?
  • 只是如果我删除这些行,我的测试就会完成并通过。我不知道为什么,但这就是它正在做的事情:(

标签: maven gwt


【解决方案1】:

更清洁的 maven 方法是附加一个单独的源 jar。

有标准方法可以在您的构建中生成它using the maven source plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-source-plugin</artifactId>
  <version>2.2.1</version>
  <executions>
    <execution>
      <id>attach-sources</id>
      <phase>verify</phase>
      <goals>
        <goal>jar-no-fork</goal>
      </goals>
    </execution>
  </executions>
</plugin>

您的 GWT 项目现在除了可以引用您的核心项目 jar 之外,还可以引用您的核心项目源:

<dependency>
  <groupId>your.project</groupId>
  <artifactId>core</artifactId>
  <version>the.same.version</version>
  <classifier>sources</classifier>
  <scope>provided</scope><!-- use for compilation only -->
</dependency>

【讨论】:

  • 非常感谢!有什么办法只在一个罐子里做到这一点?还是不是问题?
  • @LaurentT 查看其他答案。但正如我所说,这不像 maven 那样
  • 这个答案是否包含*.gwt.xml 文件?
  • 单独的 jar 源似乎好多了。 GWT jars 使用混合 jars 有什么原因吗?实际上我所知道的每个 3rd 方 GWT 模块?
【解决方案2】:

尝试在目录路径前包含 ${basedir}。

<resource>
    <directory>${basedir}/src/main/java</directory>
</resource>

【讨论】:

  • 如果我想拥有两个单独的 JAR,Sean 的解决方案很好,但在这里,因为我的 GWT 项目正在加载一个 jar(核心项目),我真的需要在我可以找到的类路径中加载一个 JAR我的消息来源。这就像一个魅力!非常感谢迈克
  • 这将包括源目录中的所有文件。虽然您可能只想包含 *.gwt.xml 以及来自 clientshared 目录的来源。
【解决方案3】:

您可以找到如何为多模块项目here 设置 maven。

*gwt.xml 文件在哪里?

如果显示的标签是 core 项目的pom.xml 文件的一部分,那么您还应该添加&lt;include&gt;**/*.gwt.xml&lt;/include&gt;

<resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.java</include>
            <include>**/*.gwt.xml</include>
        </includes>
</resource>

【讨论】:

  • 这对我有用,但是要小心,这将导致 src/main/resources 中的所有内容不包含在 jar 中。只需复制此文件并为 src/main/resources 添加另一个资源,包括适当的扩展名/通配符,即可解决此问题
  • 这个例子只包含了gwt模块需要的文件,这比一味的包含src目录中的所有文件要好。谢谢!
  • @ClickUpvote 你是对的,该示例已被编辑以使其更便携。恕我直言,现在可以加入了。
【解决方案4】:

与其他答案相比,我的方法复制所有 *.gwt.xml 模块描述符,并且仅复制模块描述符中实际指定的 java 源文件。您也不需要在 POM 和模块描述符中重复自己。

更新您的 pom:

    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>gwt-maven-plugin</artifactId>
            <version>2.7.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>resources</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

和你的 *.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<module>

    <!-- Specify the paths for translatable code -->
    <source path='shared' />

</module>

org:codehaus.mojo:gwt-maven-plugin 文档

gwt:资源
说明:将 GWT java 源代码和模块描述符复制为构建 outputDirectory 中的资源。替代在 POM 中声明 &lt;resource&gt; 并使用更精细的过滤,因为读取模块描述符以检测要复制的源。
实现:org.codehaus.mojo.gwt.GwtResourcesMojo
语言:java
绑定到阶段:流程资源

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2022-06-28
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多