【问题标题】:How to compile and run Java code with multiple packages or source files [duplicate]如何使用多个包或源文件编译和运行 Java 代码 [重复]
【发布时间】:2013-03-14 05:44:26
【问题描述】:

我一直在自学 Java,但我只使用 Eclipse 作为编译和运行我的项目的方法,并且想看看我将如何仅使用命令行来编译和运行以下文件结构(Don'不想简单地从 Eclipse 中导出 .jar 文件)。

文件结构如下:

src/
    model/
        file1.java
        file2.java
    app/
        main.java (contains main method)
        file3.java
        images/
            1.gif
            2.gif
    view/
        file4.java
        file5.java

我还需要编译的图像文件,因为我将它们用于几件事。我知道应该使用javac 命令来构建.class 文件,但是我很困惑我会用这个文件结构(和图像文件)来编译(和运行)它。任何帮助将不胜感激。

注意:我正在尝试在 Ubuntu 12.04 上编译和运行,并且严格尝试使用命令行。

【问题讨论】:

  • 使用 ant 或更好的 maven。
  • 编译包含main方法的类
  • 正如user1050755 所说,如果您想要的不仅仅是非常琐碎的玩具示例,那么值得您花时间探索antmaven。 Maven 有一个更陡峭的学习曲线,但如果你从事一个利用第三方库的真实项目,它会带来巨大的好处。如果您有非常简单的要求,您仍然应该使用ant,而不是尝试直接使用javac。 (我相信你仍然希望得到你的问题的答案,但很快你就可以提升到一个新的水平......)
  • 下次我会记住这一点。我将研究两者,看看我可以如何以及在哪里应用它们。感谢您的参考。

标签: java build compilation


【解决方案1】:

试试下面的

javac -classpath ./lib/*.jar ./src/*/*.java

如果您的 java 类使用 3d 方库,请提供正确的 jar 库路径。最好使用具有适当目录结构的构建工具。

【讨论】:

  • 好的,所以类文件将在每个相应的文件夹中生成。我将如何在类文件分散的情况下运行这个程序?
  • @Tesla 如果你的主类是com.tesla.SomeClass,你运行java com.tesla.SomeClass,java 会在com/tesla/SomeClass.class 中找到它。文件应该分散在不同的文件夹中,因为 Java 使用它来确定它们的包。
  • 那是完美的。我想我有点太糊涂了。谢谢大家。
  • ./src/*/*.java first * 适用于所有目录,它给了我文件未找到为什么请帮助
  • @Shareef : 请在此处发布您的目录结构。
【解决方案2】:

你可以说

javac src/*/*.java

但这会无条件地重新编译,会因为更多的文件而烦人,并且当你的文件多于命令行可以处理时会中断。

明智的做法是使用AntMaven(Maven 在大多数情况下更容易/更好)。您编写构建脚本(分别为build.xmlpom.xml)并运行构建器(antmvn)。

【讨论】:

    【解决方案3】:

    曾几何时,我使用 Windows 批处理文件编译 Java 项目。我记得每当我向项目中添加新包时,我都必须返回并费力地编辑它们。

    借助 Linux shell 的强大功能,您实际上可以制作一个体面的命令行构建脚本,而无需这样做:

    #!/bin/bash
    
    set -e          # quit on error
    set -u          # quit if we attempt to use undefined environment variable
    set -x          # show commands as they're executed (remove this line if done debugging)
    
    # Run this script from the project root directory
    
    cd src
    
    # Create directory structure
    find . -type d | xargs -n 1 -I I --verbose mkdir -p ../dist/class/I
    
    # Use javac to compile files
    find . -name "*.java" | javac @/dev/stdin -d ../dist/class
    
    # Copy assets
    find . -type f -and -not -name "*.java" | xargs -n 1 -I I --verbose cp I ../dist/class/I
    
    # Jar command
    jar cvf ../dist/$(basename $(readlink -f ..)) -C ../dist/class .
    

    您应该将其保存在项目根目录中名为“build.sh”的文件中。此脚本缺少一些功能。有很多冗长,所以你可以确切地看到发生了什么。它不能很好地处理带有空格或其他奇怪字符的文件名。如果你想要一个可运行的 jar 文件,你必须编写一个清单文件并将其包含在“jar”命令中。如果您的项目使用 Java 类库之外的任何外部依赖项,则必须在 javac 命令行中添加 -cp 开关,或导出 CLASSPATH 环境变量。

    上面的脚本会将资产复制到 jar 文件中。假设您在运行时提取资产,这将进行一个文件分发。 Stackoverflow 可以告诉你更多关于 How to Handle Assets in Single File within a Virtual File System in Java 的信息。

    作为替代方案,您可以简单地将资产从源目录复制到目标目录。

    作为一种风格,大多数人将他们的资产保存在与源代码不同的目录中。例如。您的两个 .gif 文件将位于 assets/app/images 而不是 src/app/images 下。只要你能说服你的构建系统做你想做的事,在技术上没有必要这样做,但我见过的大多数项目都将它们分开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多