如何在Maven中正确地包含Java源代码?

17

我正在开发一个非常简单的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源代码有关呢? - milan
只是如果我删除那些行,我的测试就会完成并通过。我不知道为什么,但就是这样做的 :( - Laurent T
可能是Maven创建包含.class和.java文件的jar文件的重复问题。 - Vadzim
4个回答

25

更加规范的Maven方式是附加一个单独的源代码Jar包。

在构建过程中,有标准方法使用Maven源代码插件生成它:

<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>

非常感谢!有没有办法只用一个JAR文件来完成这个任务?或者这不是问题吗? - Laurent T
@LaurentT 看看其他答案吧。但是正如我所说的,那不太像Maven。 - Sean Patrick Floyd
1
这个答案包括 *.gwt.xml 文件吗? - Vlastimil Ovčáčík
单独为源代码创建一个JAR文件似乎更好。为什么GWT JAR文件要使用混合JAR文件呢?实际上,我所知道的每个第三方GWT模块都是这样。 - Vlastimil Ovčáčík

12

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

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

Sean的解决方案很好,如果我想要有两个单独的JAR文件,但是由于我的GWT项目正在加载一个jar文件(核心项目),所以我真的需要一个JAR文件在类路径中被加载,以便我可以找到我的源代码。这个方法非常有效!非常感谢Mike。 - Laurent T
这将包括源目录中的所有文件。虽然您可能只想包括 *.gwt.xml 和来自 clientshared 目录的源文件。 - Vlastimil Ovčáčík

3
您可以在此处找到如何设置多模块项目的Maven:链接
*gwt.xml文件在哪里?
如果所示的标签是core项目的pom.xml文件的一部分,则还应添加<include>**/*.gwt.xml</include>:
<resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.java</include>
            <include>**/*.gwt.xml</include>
        </includes>
</resource>

这对我有用,但是要小心,这将导致src/main/resources中的所有内容都不包含在jar文件中。通过复制此内容并为src/main/resources添加另一个资源,包括适当的扩展名/通配符来解决这个问题。 - Ali
这个例子仅包括GWT模块所需的文件,这比在src目录中盲目地包含所有文件要好。谢谢! - Vlastimil Ovčáčík
@ClickUpvote 你说得对,这个例子已经被编辑过,使其更具可移植性。在我看来,现在它是可以直接使用的。 - Vlastimil Ovčáčík

0
与其他答案不同,我的方法复制所有*.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:resources
描述:将GWT Java源代码和模块描述符作为资源复制到构建的outputDirectory中。与在POM中声明<resource>并具有更细粒度过滤的方法相比,此方式能够读取模块描述符以检测要复制的源。
实现:org.codehaus.mojo.gwt.GwtResourcesMojo
语言:Java
绑定的阶段:process-resources


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接