无ide时编译和运行java

     2022-04-18     303

关键词:

最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这称之为bin),同时怎样运行新的类文件呢?” 它的提出者 kylolink解释说,“当我开始依赖Eclipse来编写代码时就开始担心没有Eclipse时自己该怎么写代码了。” 我看过很多次这类问题,事实上,这促使我(目前已经四年了)发了一篇文章: GPS系统和IDE:究竟是好还是坏? 我喜欢强大的现代化的Java的集成开发环境(IDE),因为它使得我的编程更加轻松,但知道如何构建和运行简单的Java示例也是有必要的,这篇文章主要就是着重于如何做到这些的。

我博客中一篇文章 通过简单的测试学习Java,其中写了我喜欢用一个简单的文本编辑器和命令行工具来编写并且运行简单的程序。现在我有个很棒的想法,是关于我最喜欢的Java IDE的,即早期决定使用IDE的好处是为了保证“开销”。在大多数实际应用程序中,毫无疑问IDE的开销是值得的。然而,对于最简单的示例应用程序并非总是如此。这篇文章的剩余部分展示了在没有遇到这些情况的前提下是如何构建和运行Java代码的。

建立和运行Java代码

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

Parent.java

1
2
3
4
5
6
7
8
9
10
package dustin.examples;
 
public class Parent
{
   @Override
   public String toString()
   {
      return "I‘m the Parent.";
   }
}

Child.java

1
2
3
4
5
6
7
8
9
10
package dustin.examples;
 
public class Child extends Parent
{
   @Override
   public String toString()
   {
      return "I‘m the Child.";
   }
}

Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package dustin.examples;
 
import static java.lang.System.out;
 
public class Main
{
   private final Parent parent = new Parent();
   private final Child child = new Child();
 
   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      out.println(instance.parent);
      out.println(instance.child);
   }
}

接下来显示了目录结构与这些类的 .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/Linuxjavac的文档工具查看。

当进入 javac 文档 时, -sourcepath 选项可以被用来表示源文件存在的路径。在上面所呈现的目录结构中,假设我在运行 C:javaexamplesjavacAndJava 目录的 javac 命令,这将意味着会需要这样的命令: javac -sourcepath src srcdustinexamples*.java。下一张截图显示了结果。

技术分享图片

 

因为我们没有指定 .class 文件的目标目录,在默认情况下它们被放置在同一个目录下被编译的 .java 源文件。我们可以使用 -d 选项来纠正这种情况。我们现在可以运行的命令,例如 javac -sourcepath src -d classes srcdustinexamples*.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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<project name="BuildingSansIDE" default="run" basedir=".">
   <description>Building Simple Java Applications Without An IDE</description>
 
   <target name="compile"
           description="Compile the Java code.">
      <javac srcdir="src"
             destdir="classes"
             debug="true"
      includeantruntime="false" />
   </target>
 
   <target name="run" depends="compile"
           description="Run the Java application.">
      <java classname="dustin.examples.Main" fork="true">
         <classpath>
           <pathelement path="classes"/>
         </classpath>
      </java>
   </target>
</project>

我没有使用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

1
2
3
4
5
6
7
8
9
10
11
12
13
<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>dustin.examples</groupId>
   <artifactId>CompilingAndRunningWithoutIDE</artifactId>
   <version>1</version>
 
   <build>
      <defaultGoal>compile</defaultGoal>
      <sourceDirectory>src</sourceDirectory>
      <outputDirectory>classes</outputDirectory>
      <finalName>${project.artifactId}-${project.version}</finalName>
   </build>
</project>

因为上面的 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apply plugin: ‘java‘
apply plugin: ‘application‘
 
// Redefine where Gradle should expect Java source files (*.java)
sourceSets {
    main {
        java {
            srcDirs ‘src‘
        }
    }
}
 
// Redefine where .class files are written
sourceSets.main.output.classesDir = file("classes")
 
// Specify main class to be executed
mainClassName = "dustin.examples.Main"
 
defaultTasks ‘compileJava‘, ‘run‘

前两行 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支持的简单应用就已经成长为了一个成熟的项目。

 

原文链接: dzone 翻译: ImportNew.com 郭楚沅
译文链接: http://www.importnew.com/11370.html







Eclipse IDE 中的 java.io.Console 支持

...:2010-09-1109:08:23【问题描述】:我使用EclipseIDE来开发、编译和运行我的Java项目。今天,我尝试使用java.io.Console类来管理输出,更重要的是,管理用户输入。问题是当应用程序“通过”Eclipse运行时,System.console()返回nu 查看详情

.net的开发环境和运行时环境有啥区别

。NET程序从开发到可以执行,分三个步骤:编写代码、编译、运行这里编写代码理论上可以使用记事本,不一定非要工具;编译可以使用编译器,也不是非要用特定VS工具;不过微软为了方便程序员的编写代码、编译以及调试,... 查看详情

java示例代码_如何在netbeans中检查编译器和运行时

java示例代码_如何在netbeans中检查编译器和运行时 查看详情

专有ide的单元测试[关闭]

...编写“java-ish”代码。当我按下运行按钮时,这些文件被编译成.class和.java文件。我不知道接下来会发生什么。有没有人建议我如何在这样的设置中进 查看详情

idea--error:(3,32)java:程序包org.springframework.boot不存在

导读坑问题原因解决方案坑  代码编辑器中无编译错误,通过maven的各项操作也没有问题,但是!执行就报程序包xxx不存在!问题原因  IDEA的build(编译)操作和Maven的build(编译)操作时分开的.那么我们将IDE的build委托给Maven来做.以达... 查看详情

java编译时注解和运行时注解有啥区别

区别如下:1)编译时注解,注解内容只存在源文件,在编译期间将被丢弃,不能通过JVM获取注解信息;2)运行时注解,编译时被存储在.class字节码文件,可以通过JVM运行时获取注解信息(且只限于被RUNTIME注解的注解)。参考技术A重... 查看详情

如何在ssh下远程使用ide编译和调试

在SSH下远程使用IDE编译和调试步骤如下:本地机安装运行xming,运行putty,设置putty的EnableX11forwarding跳板机上解压一个eclipsecdt,目录无所谓,哪有权限哪方便就丢哪,这解压到/opt目录,修改自己主目录下的.profile文件,添加eclipse... 查看详情

如何用javac和java编译运行整个java工程

如何用javac和java编译运行整个Java工程前言:本文教你怎么用javac和java命令,以及如何利用脚本(shell或bat)方便处理,并用简单的实例展示这些用法。    IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码... 查看详情

如何用javac和java编译运行整个java工程

转自:http://blog.csdn.net/huagong_adu/article/details/6929817   前言:本文教你怎么用javac和Java命令,以及如何利用脚本(shell或bat)方便处理,并用简单的实例展示这些用法。    IDE是把双刃剑,它可以什么都帮... 查看详情

Gradle 中编译和运行时配置的区别

】Gradle中编译和运行时配置的区别【英文标题】:DifferencebetweencompileandruntimeconfigurationsinGradle【发布时间】:2013-05-1801:06:37【问题描述】:我的问题有点常见,但也与Gradle相关。为什么我们需要编译和运行时配置?当我编译某些... 查看详情

buildtool

...比如一个Java程序的构建过程就是:编写源代码将.java文件编译为.class文件执行.class文件输出结果上面的构建过程中需要用到Jdk中的java和javac等命令进行编译和执行。为什么要使用buildtool?日常开发中我们当然不会每次都在终端中... 查看详情

java中list的泛型问题

...看不出来。假设实际中是个Map,那么编码时我不知道。在编译的时候这里不报错,运行时如果我用lst.get(0).A'sMethod,这里就报错了。会提示无法将map强转为A。那么我就想知道,在这种List<A>lst方式声明的场景下,java是不是... 查看详情

如何将 java 源代码保存在 xml 文件中,并在 IDE 中编辑/编译它?

】如何将java源代码保存在xml文件中,并在IDE中编辑/编译它?【英文标题】:Howtosavejavasourcecodeinanxmlfile,andedit/compileitinanIDE?【发布时间】:2012-10-1512:46:38【问题描述】:我们有一个java应用程序,用户可以在其中编写/执行他们自... 查看详情

如何在 Sublime Text 2 中编译和运行 C 程序?

】如何在SublimeText2中编译和运行C程序?【英文标题】:HowdoIcompileandrunaCprograminSublimeText2?【发布时间】:2013-01-1507:19:34【问题描述】:我对编程完全陌生。我不知道如何在SublimeText2中编译和运行一个简单的C程序。(在大学时,我... 查看详情

java生成代码(字节码)

一、方式代码生成器&IDE编译时代码生成:PluggableAnnotationProcessingAPI运行时代码生成:CompilerAPI运行时生成字节码:cglib,javassist二、辅助工具Stringformattool模板引擎:freemarker,velocityJavaPoet 查看详情

编译和运行

编译和运行编译时编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中... 查看详情

当项目中发生更改时,Xcode 如何编译文件?

】当项目中发生更改时,Xcode如何编译文件?【英文标题】:HowdoesXcodecompilefileswhenchangesaremadeinaproject?【发布时间】:2013-05-1612:39:57【问题描述】:我是iOS编程和Xcode的新手。请帮助我了解Xcode是如何编译和运行代码的。理想情况... 查看详情

设置sublime文本3以在ubuntu16.04lts上运行和编译java时出错

我是SublimeText3的新手,我想在SublimeText3上运行和编译java代码。但是,我得到了这个奇怪的错误:/bin/bash:javac:commandnotfound[Finishedin0.0swithexitcode127]和我在/home/***/Downloads/sublime_text_3/Packages/Java.sublime-package/JavaC.sub 查看详情