建立和运行Java代码

为了对这篇文章进行更具体的讨论,我将使用一些非常简单的Java类,在同一个包中通过彼此相关的组合或继承(不在 未命名的包中)来调用dustin.examples。这两个在第三个类之前是没有 main 函数的,直到 Main.java 才有 main 函数为了在没有IDE的情况下运行示例。三个类的代码清单如下。

Parent.java

Child.java

Main.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。下一张截图显示了结果。

因为我们没有指定 .class 文件的目标目录,在默认情况下它们被放置在同一个目录下被编译的 .java 源文件。我们可以使用 -d 选项来纠正这种情况。我们现在可以运行的命令,例如 javac -sourcepath src -d classes src\dustin\examples\*.java。如前所述,指定目标目录(classes)必须是存在的。这样,命令将会在下面的截图指定的目录下定位.class文件。

用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的命令。

构建和运行Ant

对于最简单的Java应用程序, javac and java 使用起来非常简单,它们用于构建并执行应用程序就分别证明了这一点。应用程序会稍微复杂一点(如代码中存在多个包/目录或更复杂的依赖于第三方库和框架的类路径),但这种方法非常难用。 Apache Ant 是最古老的“三巨头”,它是被用于成千上万的应用程序部署的Java构建工具。正如我讨论过 以前的一篇博客,一个基础的Ant构建文件很容易被创建,特别是如果都始于一个模板就像我在 这篇文章中介绍的一样。

接下来的代码是Ant的 build.xml 文件的,它将 .java 文件 编译成 .class文件然后运行 dustin.examples.Main 类就像上面的 javac 和 java一样。

build.xml

我没有使用Ant也没有包括一般所用的方式(例如 “clean” 和 “javadoc”),我使用的是 javac和 java来使例子尽可能的简单。请注意我使用了”debug”来给javac Ant 任务设置”true”;因为这不是Ant的默认方式而是javac的默认方式。的确,Ant的 javac task 和 java task与 javac and java的命令工具非常相似。

因为我希望使用默认名称Ant来构建文件的时候不显式指定(build.xml),因为我提供“运行”的目标,构建文件的“默认形式”,因为“编译”作为一个依赖包括“运行”的目标,此外Ant是我的环境路径,我所需要做的是在命令行上让Ant来编译运行目录下的“ant”类型的 build.xml文件示例,下图就印证了这一点。

虽然我演示了用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 文件,这在下张截图中将会显示。

我也可以用Maven的 mvn exec:java -Dexec.mainClass=dustin.examples.Main命令来运行编译后的应用程序,下图得以展示。

与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”命令,接下来将得到证实。

甚至最大的怀疑者都承认Gradle构建对于这个简单示例都非常方便。它的某些约定和假设结合了简洁的依赖,很容易根据需要重写选择违约的机制。这一事实,这在Groovy而不是XML中也非常吸引人!

Ant和Maven一样,我倾向于只用这些工具,通过 java 或者脚本调用 java来直接构建和运行编译好的 .class文件。顺便说一下,我通常也保存这些 .class 文件为JAR来运行,但这超出了本文的范围。

总结

IDE通常没有必要构建简单的应用程序和例子,它的开销甚至比最简单的例子都要多,这时直接使用 javac 和 java 来构建和运行实例就显得非常方便。为了使Ant,Maven或者Gradle的构建工具变得更加有吸引力,许多IDE支持着这些构件工具,这意味着开发者要将构件工具转移到IDE上,如果已经确定了先前创建的过程,那么IDE支持的简单应用就已经成长为了一个成熟的项目。

无ide编译java_无IDE编译和运行java相关推荐

  1. 无锁队列 java_无锁队列的总结

    首次接触无锁数据结构的设计,请各位大佬多多指教~~~ CAS(Compare && Swap)原子操作 CAS是无锁(lock free)的数据结构的基础.用伪代码描述: input: ...

  2. 能编译java_我能够编译java程序但不能运行java程序

    当我运行java程序时,它给出了以下错误: Exception in thread "main" java.lang.NoClassDefFoundError: check Cau ...

  3. sh 启动java_使用start.sh脚本运行Java程序

    Java项目打jar包 此处以Maven工程为例,进入Java项目根目录,执行mvn package命令: 执行成功之后,项目根目录会出现一个target文件下,我们的jar包就在target目录下. ...

  4. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  5. 【错误记录】Android Studio 编译报错 ( This Gradle plugin requires a newer IDE able to request IDE model leve )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Android Studio 中编译 VirtualApp , 报如下错误 : Gradle 'VirtualApp' project refr ...

  6. java 编译 器 ide_在没有IDE的情况下编译和运行Java

    java 编译 器 ide 最近一个名为" 不使用IDE编译Java软件包 "的Java subreddit线程提出了一个问题:"是否有一个命令将软件包内的一组Java文 ...

  7. 在没有IDE的情况下编译和运行Java

    最近一个名为" 不使用IDE编译Java软件包 "的Java subreddit线程提出了一个问题:"是否有一个命令将软件包内的一组Java文件编译到一个单独的文件夹中( ...

  8. submlime text写java_在Sublime Text 3中配置编译和运行Java程序

    1.设置java的PATH环境变量 2.创建批处理或Shell脚本文件 要想编译运行Java程序,需要创建一个批处理或者Shell脚本 Windows: runJava.bat: @echo off ...

  9. ultraedit编译java_在UltraEdit中编译和运行Java程序

    一.首先打开UltraEdit, 点击菜单上的 高级->工具配置,如图: 1 点击插入: 2 在菜单项名称写上该功能,"编译java ": 3 创建一个批处理的文件compi ...

最新文章

  1. Django-model中的Querysets
  2. Wannafly 挑战赛16 A 取石子
  3. 【原创】推荐广告入门:DeepCTR-Torch,基于深度学习的CTR预测算法库
  4. 0122互联网新闻 | 知乎短视频“即影”正式上线;天猫与故宫开启2019“天猫新文创”计划...
  5. Leetcode题库 5.最长回文子串(C++实现)
  6. Java 开源库精选(持续更新)
  7. python解决问题asp_用python实现面向对像的ASP程序实例
  8. h5链接加上 vconsole_又出爆款!凯美瑞和红旗H5没法比!
  9. Linux系统超全超实惠的命令行工具
  10. 计算机网络学习笔记(29. DNS概述)
  11. 开发中一些常用的css小技巧
  12. Win11连接WiFi后显示无Internet访问权限怎么办?
  13. poj 1035 Spell checker【字符串】
  14. 如何用纯 CSS 创作 404 文字变形为 NON 文字的交互特效
  15. 【基础篇】————28、横向渗透
  16. java 图片添加蒙版处理
  17. ue 清理缓存_浏览器缓存数据清理
  18. 一文带你了解降压型稳压芯片原理
  19. 20十年后的计算机作文600字,二十年后的我作文600字
  20. android banner停止轮播,android如何实现banner轮播图无限轮播效果

热门文章

  1. 【单片机基础篇】74HC595芯片详解
  2. 使用Arduino和超声波传感器实现简单测距
  3. 盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重-题解(Java代码)
  4. reprint函数的用法c语言,百篇大计敬本年之C语言巅峰之道《五》—— snprintf 是否需要 memset 缓冲区...
  5. java多线程异步调用别的系统接口代码_60 多个实例讲解,彻底搞懂 Java 多线程!
  6. linux重启memcache_linux下启动和停止memcached
  7. 推荐系统算法_CUCS | 推荐系统算法简介Matrix Factorization(矩阵分解)
  8. matlab去掉空的元组,python – 删除pandas中包含空元组列表的行
  9. java 登陆实例,2021-03-19 java案例:用户登录
  10. SQL中的模糊范围查询特殊符号应用