我一直在教自己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上运行,并且我正在尝试使用命令行。
答案 0 :(得分:3)
尝试以下
javac -classpath ./lib/*.jar ./src/*/*.java
如果您的java类使用3d派对库,请提供正确的jar库路径。最好使用具有适当目录结构的构建工具。
答案 1 :(得分:0)
你可以说
javac src/*/*.java
但是无条件地重新编译,会因为有更多文件而烦人,并且当你拥有的文件多于命令行可以处理的文件时会中断。
明智的做法是使用Ant或Maven(在大多数情况下,Maven更容易/更好)。您编写了一个构建脚本(分别为build.xml
或pom.xml
)并运行构建器(ant
或mvn
)。
答案 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。只要你能说服你的构建系统做你想做的事情,在技术上就没必要这样做,但是我见过的大多数项目将它们分开了。