2013-03-14 313 views
2

我一直在教自己的Java,但我只使用Eclipse作为编译和运行我的项目的方法,并希望看到我将如何编译和仅使用命令行运行以下文件结构(不想仅从eclipse中导出.jar文件)。如何编译和运行多个包或源文件的Java代码

文件结构如下:

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

+2

使用ant或更好的maven。 – user1050755 2013-03-14 05:46:36

+0

编译包含主要方法的类 – Shurmajee 2013-03-14 05:48:44

+1

正如'user1050755'所说,如果你不仅仅想看到非常微不足道的玩具示例,还是值得探索'ant'或'maven'。 Maven的学习速度更快,但如果您参与一个真正的项目,并借鉴第三方库,将会带来巨大的收益。如果你有非常简单的要求,你应该直接使用'ant'来试图使用javac。 (我相信你仍然会喜欢你的问题的答案,但很快你就可以踏上新的台阶......) – 2013-03-14 05:54:23

回答

3

请尝试以下

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

给适当的jar库路径,如果你的java类使用3D党库。最好使用具有适当目录结构的构建工具。

+0

好的,所以类文件将在每个文件夹中生成。我将如何使用散布的类文件来运行此程序? – Tesla 2013-03-14 05:57:25

+0

@Tesla如果您的主类是'com.tesla.SomeClass',那么您运行java'com.tesla.SomeClass',并且java会希望在'com/tesla/SomeClass.class'中找到它。文件*应该分散在不同的文件夹中,因为Java使用它来确定它们的包。 – 2013-03-14 06:05:18

+0

这是完美的。我觉得我太困惑自己了。多谢你们。 – Tesla 2013-03-14 06:12:04

0

可以说

javac src/*/*.java 

但是,这将无条件重新编译,将恼人的更多的文件,当你有比在命令行中更多的文件可以解决将打破。

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

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。只要你能说服你的构建系统去做你想做的事情,但是我看到的大多数项目将它们分离出来,这在技术上没有必要这样做。