【问题标题】:How to include source file(.java file) parallel to .class file in the generated jar using maven如何使用 maven 在生成的 jar 中包含与 .class 文件并行的源文件(.java 文件)
【发布时间】:2025-12-21 15:10:15
【问题描述】:

我想创建带有战争的 jars,其中应该包含与使用 maven 生成的 jar 中的 .class 文件平行的源文件(.java 文件)。 (我知道有一些插件可用于生成单独的 xyy-sources.jar 文件。但我不想创建单独的源 jar。我需要一个 .class 和 .java 文件并行存在的单个 jar 文件)

【问题讨论】:

  • 你能解释一下关于“战争”的部分吗?
  • 为什么要在 .class 文件中包含源代码? 永远不要这样做,您会在真正的可执行文件中浪费空间而无济于事。如果你想要一个包含源和可执行jar的单个包,常见的方法是首先生成可执行jar,然后生成一个包含binlib目录的源jar,其中包含可执行jar。
  • 我得到了解决方案。您只需在 build 标签下添加资源。例如。 src/main/java。现在,您创建的每个 jar 和 war 文件也将包含 .java 文件。 :) 无论如何,非常感谢您的回复。

标签: java class maven jar


【解决方案1】:

你只需要在 build 标签下添加资源。 例如。

<build>
   <resources>
      <resource>
        <directory>src/main/java</directory>
      </resource>     
    </resources>
</build>

现在您创建的每个 jar 和 war 文件也将包含 .java 文件。 :)

【讨论】:

    【解决方案2】:

    我仍然不确定我是否理解您为什么要这样做,但您可以使用 maven-resource-plugin 尤其是它的 copy-resource 目标将您的 java 文件复制到构建目录中的任何位置。因此,例如要将它们复制到 classes 文件夹,然后将其包含在自动构建的 jar 中,您可以执行以下操作:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.3</version>
        <executions>
            <execution>
                <id>copy-resources</id>
                <phase>process-resources</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.outputDirectory}/src-files-location</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/java</directory>
                            <includes>
                                <include>**/*.java</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

      【解决方案3】:

      我不确定在 .class 旁边包含 .java 是否是一个好主意。你想这样做有什么具体原因吗?

      如果你需要包含源,你可以像这样通过执行 mvn package 创建一个单独的源 jar(这不是你要求的,但推荐的方式)

      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
      

      这有帮助吗? http://maven.apache.org/plugin-developers/cookbook/attach-source-javadoc-artifacts.html

      【讨论】:

      • 这将创建一个带有分类器 sources 的单独 jar 文件,而不是 OP 想要的。
      • @khmarbaise:Atul 已经说过 不是你要求的,但你能想象一个将源代码与 .类文件?
      • @SergeBallesta 我编辑了我的答案并在 khmarbaise 的评论之后添加了“(这不是你要求的,但推荐的方式)”。所以感谢他的评论。无论如何,我也无法猜测在可执行 jar 中包含源代码的原因。
      • 我必须在 .classs 中包含源代码的原因是,将 war 文件输入到代码分析工具中。该工具要求两者都显示导致问题的正确行。