无IDE时编译和运行Java
2015-06-28 21:21
615 查看
本文由 ImportNew - 郭楚沅 翻译自 dzone。欢迎加入翻译小组。转载请见文末要求。
我博客中一篇文章 通过简单的测试学习Java,其中写了我喜欢用一个简单的文本编辑器和命令行工具来编写并且运行简单的程序。现在我有个很棒的想法,是关于我最喜欢的Java
IDE的,即早期决定使用IDE的好处是为了保证“开销”。在大多数实际应用程序中,毫无疑问IDE的开销是值得的。然而,对于最简单的示例应用程序并非总是如此。这篇文章的剩余部分展示了在没有遇到这些情况的前提下是如何构建和运行Java代码的。
建立和运行Java代码
为了对这篇文章进行更具体的讨论,我将使用一些非常简单的Java类,在同一个包中通过彼此相关的组合或继承(不在 未命名的包中)来调用
Parent.java
Child.java
Main.java
接下来显示了目录结构与这些类的
用javac构建和运行java
无论使用哪种方法正常地构建Java代码(Ant, Maven, Gradle, 或者 IDE),我相信谨慎的做法是,至少了解如何使用 javac来构建Java代码。Oracle/Sun的支持者们使用 javac 命令行工具的基本项来运行,
当进入 javac 文档 时,
![](http://incdn1.b0.upaiyun.com/2014/05/e2c4f7a2bb4e782c575034683aee3eea.png)
因为我们没有指定
![](http://incdn1.b0.upaiyun.com/2014/05/94de092ec400d1c02bec13f3db33d323.png)
用Java源文件编译成适当的
![](http://incdn1.b0.upaiyun.com/2014/05/50aba61b44d4e7316cdfc7d0a5f6cb98.png)
构建和运行Ant
对于最简单的Java应用程序,
Ant 是最古老的“三巨头”,它是被用于成千上万的应用程序部署的Java构建工具。正如我讨论过 以前的一篇博客,一个基础的Ant构建文件很容易被创建,特别是如果都始于一个模板就像我在 这篇文章中介绍的一样。
接下来的代码是Ant的
编译成
build.xml
我没有使用Ant也没有包括一般所用的方式(例如 “clean” 和 “javadoc”),我使用的是
Ant 任务设置”true”;因为这不是Ant的默认方式而是javac的默认方式。的确,Ant的 javac
task 和 java task与
因为我希望使用默认名称Ant来构建文件的时候不显式指定(
![](http://incdn1.b0.upaiyun.com/2014/05/99cfb2271b636436edc1c43dae1d9180.png)
虽然我演示了用Ant编译和运行一个简单的Java应用程序,通常我只用Ant进行编译同时用
用Maven来搭建和运行
虽然Ant是第一个主流的Java构建工具, Apache Maven 最终获得了成功在很大程度上要感谢它采用的配置是按照惯例同时也支持常见的库。当代码和生成的 标准目录布局对象一致时,Maven很容易使用。很遗憾,我的例子不遵循这个目录结构,但Maven允许我 覆盖默认的目录结构。下面的Maven
POM文件覆盖了源代码和目标目录以及提供了一个Maven构建所需的最小元素,此时Maven的版本是Maven
3.2.1。
pom.xml
因为上面的
![](http://incdn1.b0.upaiyun.com/2014/05/5ef431c6cd6bb701c8425adc1c66d052.png)
我也可以用Maven的
![](http://incdn1.b0.upaiyun.com/2014/05/b5b04eb975afa7b5602dc8fd828b9df2.png)
与Ant一样,我通常不使用Maven运行简单的Java应用程序,而是用
用Gradle构建和运行
Gradle 是最新,最流行和最时尚的三大主流Java构建工具之一。我有时会怀疑时髦东西的本质,但是我发现了有不少东西 例如Gradle (用Groovy编写的XML,
内置Ant支持和Ivy支持,配置按照惯例很容易被覆盖,Maven存储库支持等)。下一个例子显示了一个Gradle构建文件,它可用于编译和运行一个简单的应用程序,这里主要展示一下示例代码。它改编自我在博客 简单Gradle
Java插件定义的例子。
build.gradle
前两行
plugin 和 Application
plugin的应用程序,它将许多功能自动构建。“sourceSets” 和 “sourceSets.main.output.classesDir”的定义允许覆盖Gradle’s Java 插件各自的Java源代码和编译文件类的默认目录。“mainClassName”明确了规范类应该作为应用程序的一部分插件运行。“defaultTasks”指定要运行的任务,只需在命令行键入:‘compileJava’是一个标准的提供任务的Java插件,‘run’是一个标准的提供任务的应用程序的插件。因为我称构建文件为
方式,因为我有Gradle的
![](http://incdn1.b0.upaiyun.com/2014/05/7e1b4195c83ec62003a108ed8092e0bf.png)
甚至最大的怀疑者都承认Gradle构建对于这个简单示例都非常方便。它的某些约定和假设结合了简洁的依赖,很容易根据需要重写选择违约的机制。这一事实,这在Groovy而不是XML中也非常吸引人!
Ant和Maven一样,我倾向于只用这些工具,通过
总结
IDE通常没有必要构建简单的应用程序和例子,它的开销甚至比最简单的例子都要多,这时直接使用
原文链接: dzone 翻译: ImportNew.com - 郭楚沅
译文链接: http://www.importnew.com/11370.html
[ 转载请保留原文出处、译者和译文链接。]
最近 Java
subreddit 出现了一篇”在没有IDE的情况下编译Java包”
的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这称之为bin),同时怎样运行新的类文件呢?” 它的提出者 kylolink解释说,“当我开始依赖Eclipse来编写代码时就开始担心没有Eclipse时自己该怎么写代码了。”
我看过很多次这类问题,事实上,这促使我(目前已经四年了)发了一篇文章: GPS系统和IDE:究竟是好还是坏? 我喜欢强大的现代化的Java的集成开发环境(IDE),因为它使得我的编程更加轻松,但知道如何构建和运行简单的Java示例也是有必要的,这篇文章主要就是着重于如何做到这些的。
我博客中一篇文章 通过简单的测试学习Java,其中写了我喜欢用一个简单的文本编辑器和命令行工具来编写并且运行简单的程序。现在我有个很棒的想法,是关于我最喜欢的JavaIDE的,即早期决定使用IDE的好处是为了保证“开销”。在大多数实际应用程序中,毫无疑问IDE的开销是值得的。然而,对于最简单的示例应用程序并非总是如此。这篇文章的剩余部分展示了在没有遇到这些情况的前提下是如何构建和运行Java代码的。
建立和运行Java代码
为了对这篇文章进行更具体的讨论,我将使用一些非常简单的Java类,在同一个包中通过彼此相关的组合或继承(不在 未命名的包中)来调用
dustin.examples。这两个在第三个类之前是没有
main函数的,直到
Main.java才有
main函数为了在没有IDE的情况下运行示例。三个类的代码清单如下。
Parent.java
.java源文件。截图显示源文件的目录层次结构代表了包名(
dustin/examples源自包
dustin.examples)和该子目录下被称为package-reflecting的目录层次结构
src。我还创建了
classes子目录(当前为空)用于存放编译后文件
.class文件,因为
javac在目录不存在的情况下不会创建该目录。
用javac构建和运行java
无论使用哪种方法正常地构建Java代码(Ant, Maven, Gradle, 或者 IDE),我相信谨慎的做法是,至少了解如何使用 javac来构建Java代码。Oracle/Sun的支持者们使用 javac 命令行工具的基本项来运行,
javac -help也可以运行
javac -help -X来查看其它的扩展选项。如何应用这些选项的更多细节可以在 Windows 或者 Unix/Linux的
javac的文档工具查看。
当进入 javac 文档 时,
-sourcepath选项可以被用来表示源文件存在的路径。在上面所呈现的目录结构中,假设我在运行
C:\java\examples\javacAndJava\目录的
javac命令,这将意味着会需要这样的命令:
javac -sourcepath src src\dustin\examples\*.java。下一张截图显示了结果。
![](http://incdn1.b0.upaiyun.com/2014/05/e2c4f7a2bb4e782c575034683aee3eea.png)
因为我们没有指定
.class文件的目标目录,在默认情况下它们被放置在同一个目录下被编译的
.java源文件。我们可以使用
-d选项来纠正这种情况。我们现在可以运行的命令,例如
javac -sourcepath src -d classes src\dustin\examples\*.java。如前所述,指定目标目录(
classes)必须是存在的。这样,命令将会在下面的截图指定的目录下定位.class文件。
![](http://incdn1.b0.upaiyun.com/2014/05/94de092ec400d1c02bec13f3db33d323.png)
用Java源文件编译成适当的
.class文件在指定的目录中,我们现在可以运行Java应用程序启动命令行工具 java。这仅仅是通过by
java -help所示的指令或者是 java工具页 和
.class文件的
-classpath所指定的地方(或
-cp)选项。使用两种方法来指定
classes目录以便用于找到
.class文件,接下来的截图印证了这点。最后一个参数是完全合格的(整个Java包)类名,它有一个
main函数来执行。下面的截图显示了
java -cp classes dustin.examples.Main和
java -classpath classes dustin.examples.Main的命令。
![](http://incdn1.b0.upaiyun.com/2014/05/50aba61b44d4e7316cdfc7d0a5f6cb98.png)
构建和运行Ant
对于最简单的Java应用程序,
javacand
java使用起来非常简单,它们用于构建并执行应用程序就分别证明了这一点。应用程序会稍微复杂一点(如代码中存在多个包/目录或更复杂的依赖于第三方库和框架的类路径),但这种方法非常难用。 Apache
Ant 是最古老的“三巨头”,它是被用于成千上万的应用程序部署的Java构建工具。正如我讨论过 以前的一篇博客,一个基础的Ant构建文件很容易被创建,特别是如果都始于一个模板就像我在 这篇文章中介绍的一样。
接下来的代码是Ant的
build.xml文件的,它将
.java文件
编译成
.class文件然后运行
dustin.examples.Main类就像上面的
javac和
java一样。
build.xml
javac和
java来使例子尽可能的简单。请注意我使用了”debug”来给javac
Ant 任务设置”true”;因为这不是Ant的默认方式而是javac的默认方式。的确,Ant的 javac
task 和 java task与
javacand
java的命令工具非常相似。
因为我希望使用默认名称Ant来构建文件的时候不显式指定(
build.xml),因为我提供“运行”的目标,构建文件的“默认形式”,因为“编译”作为一个依赖包括“运行”的目标,此外Ant是我的环境路径,我所需要做的是在命令行上让Ant来编译运行目录下的“ant”类型的
build.xml文件示例,下图就印证了这一点。
![](http://incdn1.b0.upaiyun.com/2014/05/99cfb2271b636436edc1c43dae1d9180.png)
虽然我演示了用Ant编译和运行一个简单的Java应用程序,通常我只用Ant进行编译同时用
java来运行(或者如果classpath非常复杂时就使用
java脚本来执行)。
用Maven来搭建和运行
虽然Ant是第一个主流的Java构建工具, Apache Maven 最终获得了成功在很大程度上要感谢它采用的配置是按照惯例同时也支持常见的库。当代码和生成的 标准目录布局对象一致时,Maven很容易使用。很遗憾,我的例子不遵循这个目录结构,但Maven允许我 覆盖默认的目录结构。下面的Maven
POM文件覆盖了源代码和目标目录以及提供了一个Maven构建所需的最小元素,此时Maven的版本是Maven
3.2.1。
pom.xml
pom.xml文件指定了一个“compile”的“defaultGoal”,
pom.xml是默认定义的POM文件,用执行器(mvn)来搜索,因为Maven安装的
bin文件夹在我的path环境变量中,我只需要运行“mvn”来编译
.class文件,这在下张截图中将会显示。
![](http://incdn1.b0.upaiyun.com/2014/05/5ef431c6cd6bb701c8425adc1c66d052.png)
我也可以用Maven的
mvn exec:java -Dexec.mainClass=dustin.examples.Main命令来运行编译后的应用程序,下图得以展示。
![](http://incdn1.b0.upaiyun.com/2014/05/b5b04eb975afa7b5602dc8fd828b9df2.png)
与Ant一样,我通常不使用Maven运行简单的Java应用程序,而是用
java运行编译后的代码(或者使用脚本直接调用
java的classpath路径)。
用Gradle构建和运行
Gradle 是最新,最流行和最时尚的三大主流Java构建工具之一。我有时会怀疑时髦东西的本质,但是我发现了有不少东西 例如Gradle (用Groovy编写的XML,
内置Ant支持和Ivy支持,配置按照惯例很容易被覆盖,Maven存储库支持等)。下一个例子显示了一个Gradle构建文件,它可用于编译和运行一个简单的应用程序,这里主要展示一下示例代码。它改编自我在博客 简单Gradle
Java插件定义的例子。
build.gradle
build.gradle文件指定 Java
plugin 和 Application
plugin的应用程序,它将许多功能自动构建。“sourceSets” 和 “sourceSets.main.output.classesDir”的定义允许覆盖Gradle’s Java 插件各自的Java源代码和编译文件类的默认目录。“mainClassName”明确了规范类应该作为应用程序的一部分插件运行。“defaultTasks”指定要运行的任务,只需在命令行键入:‘compileJava’是一个标准的提供任务的Java插件,‘run’是一个标准的提供任务的应用程序的插件。因为我称构建文件为
build.gradle,因为我指定默认的‘compileJava’任务和‘run’
方式,因为我有Gradle的
bin文件夹安装目录,我需要做的就是构建和运行示例来 键入“gradle”命令,接下来将得到证实。
![](http://incdn1.b0.upaiyun.com/2014/05/7e1b4195c83ec62003a108ed8092e0bf.png)
甚至最大的怀疑者都承认Gradle构建对于这个简单示例都非常方便。它的某些约定和假设结合了简洁的依赖,很容易根据需要重写选择违约的机制。这一事实,这在Groovy而不是XML中也非常吸引人!
Ant和Maven一样,我倾向于只用这些工具,通过
java或者脚本调用
java来直接构建和运行编译好的
.class文件。顺便说一下,我通常也保存这些
.class文件为JAR来运行,但这超出了本文的范围。
总结
IDE通常没有必要构建简单的应用程序和例子,它的开销甚至比最简单的例子都要多,这时直接使用
javac和
java来构建和运行实例就显得非常方便。为了使Ant,Maven或者Gradle的构建工具变得更加有吸引力,许多IDE支持着这些构件工具,这意味着开发者要将构件工具转移到IDE上,如果已经确定了先前创建的过程,那么IDE支持的简单应用就已经成长为了一个成熟的项目。
原文链接: dzone 翻译: ImportNew.com - 郭楚沅
译文链接: http://www.importnew.com/11370.html
[ 转载请保留原文出处、译者和译文链接。]
相关文章推荐
- 《Java程序设计》第16周周五:数据库连接与随机数的使用
- springmvc和servlet在上传和下载文件(保持文件夹和存储数据库Blob两种方式)
- 进程互斥(二)Dekker算法
- spring set注入
- How to use CyclicBarrier in Java - Concurrency Tutorail(转)
- Java对文本进行分词
- struts2.1笔记05:struts2开发环境的搭建
- Java添加事件监听的四种方法代码实例
- JAVA基础--发送Email
- java学习之旅39--面向对象_12_继承_方法的重写
- Java设计模式之抽象工厂模式
- spring bean初始化和销毁
- java基础之java中的基本数据类型
- 编程思想之多线程与多进程(3)——Java中的多线程
- java Session管理
- 进程互斥(一)相关概念
- 1008--Java 大对象类型的 Hiberante 映射
- SpringMVC通过@autowired自动装载Service时提示装载错误
- spring中自定义属性编辑器CustomEditorConfigurer
- java垃圾回收算法