如何使用多个包或源文件编译和运行Java代码

时间:2013-03-14 05:44:26

标签: java build compilation

我一直在教自己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上运行,并且我正在尝试使用命令行。

3 个答案:

答案 0 :(得分:3)

尝试以下

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

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

答案 1 :(得分:0)

你可以说

javac src/*/*.java

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

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

答案 2 :(得分: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可以告诉您有关How to Handle Assets in Single File within a Virtual File System in Java的更多信息。

作为替代方案,您只需将资源从源目录复制到目标目录即可。

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