2

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

文件结构如下:

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 上编译和运行,并且严格尝试使用命令行。

4

3 回答 3

3

尝试以下

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

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

于 2013-03-14T05:53:33.110 回答
0

你可以说

javac src/*/*.java

但这将无条件地重新编译,会因更多文件而烦人,并且当您拥有的文件多于命令行无法处理时会中断。

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

于 2013-03-14T05:51:02.430 回答
0

曾几何时,我用 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 类库之外的任何外部依赖项,则必须将 -cp 开关添加到 javac 命令行,或导出 CLASSPATH 环境变量。

上面的脚本会将资产复制到 jar 文件中。假设您在运行时提取资产,这将进行一个文件分发。Stackoverflow 可以告诉您有关如何在 Java 中的虚拟文件系统中处理单个文件中的资产的更多信息。

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

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

于 2013-03-14T06:27:45.470 回答