`
mmdev
  • 浏览: 13219007 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

JAVA命令行编译运行基础(linux下)

 
阅读更多

(初学者的一些总结~高手们勿喷哈~)

原因:

以前一直用Eclispe编程环境运行java。非常舒服,就像用傻瓜相机照相一般。

有看见许多高手都是直接用vim编辑文件,命令行编译运行,觉得那样不是反而更繁琐?

转折点是在前几天本科毕设题目选定之后。毕设题是一个基于java 字节码的类关系动态分析。需要对.class文件中字节码进行更改(具体的说是在许多指令后加入做标记的新指令,以实现动态跟踪的目的)。

我发现,eclipse根本无法如此灵活,他无法直接装载运行一个我修改过的.class文件。它是照顾大多数的一般情况。它为我们做了很多事情:自动将.java源文件编译成.class字节文件,帮我们加载类、运行。但却无法满足我个性化的需求。命令行虽然麻烦,却是更加本质。

至少从这一点上看,java的命令行编译运行还是非常重要的。

我查阅了不少网上资料,发现资料虽多,却并不齐全,也不是太清晰。于是整理如下,希望对初涉java命令行编译运行的筒子有些帮助吧!

许多初学者编译运行时候的Exception的发生,下面的方法都能解决了~如果你遇到什么问题,仔细看看下面先~说不定有所帮助噢。


java的运行机制的基本概念:

源文件也就是我们熟知的.java文件。

类文件.class文件是编译器由.java文件编译而成。众所周知,Java的跨平台性在于Java虚拟机(JVM)这一层对硬件的隔离,而.class文件可以理解为JVM中的执行文件(自己的理解,可能不太准确)。里面存储的是java字节码,java bytecode 是基于栈的(stack based)(关于字节码和JVM更详细的官方解释可以参照TheJava Virtual Machine Specification,如果嫌那本书太厚,另外再推荐一本Programming for the Java Virtual Machine)。

编译Java的编译一般是指从源文件(.java文件)到类文件(.class文件)的转化过程。在JDK命令行中是 javac 命令(java compiler的缩写~跟C语言木关系的~)

运行 在JVM中执行.class文件。是 java 命令。

CLASSPATH 环境变量,存储着编译某文件或运行某类时,所要搜索的目录。 比如:在Hello.java中有使用到一个第三方包ThirdPart.jar中的类,那么必须在classpath中添加相应的路径,让编译器能找到它。(注意~把ThirdParty.jar放在当前的工作目录下,没有告诉环境变量也是不行的~编译器只认环境变量的!)同样的道理,在运行某类文件时,有涉及到第三方jar包的也必须添加到CLASSPATH中。一般的,有三种方式修改环境变量。

1.在javac 或者java命令中,使用 -classpath 选项,后面跟着需要的目录地址。显然,这种方法只能在当前语句范围内生效。

2.直接命令行修改CLASSPATH或者PATH # PATH=$JAVA_HOME/bin:/home/username/bin

#export PATH

不过这种方法只能在此次运行中生效。

3.永久生效的方法是修改配置文件。在 /etc/profile 或者 /etc/profile.d 或者其他,不同操作系统发行版地点不同。在文件中加上CLASSPATH=......(相应路径),重启电脑即可(也可一执行source命令,那样不用重启就已经生效啦~# source /etc/profile.d 其实 . 跟source是一样的效果噢~ #. /etc/profile.d )

PATH环境变量跟CLASSPATH 类似,只不过它不是用来寻找类的,而是用来寻找java相关执行文件的。可以通过 java -version 命令来查看自己是否已经设置好了PATH(如果显示了详细java信息,则已经设置好了,没有的话,还需要找到java的安装位置,重新设置)

环境变量的具体相关信息,参照doc PATH and CLASSPATHSetting the class path

jar包

java里用package的概念避免重复命名的问题。有点像C++的namespace。同一个包里的类是可以直接使用的。不同包的话,则需要在.java文件头部import进对应的package。初学者写的helloworld程序当然是不用注意到包的问题,但当工程越来越大,重复命名的可能性增大,我们就必须依靠package的概念来更好的管理我们的代码了。

同时,为了方便管理、传输,jar包出现了。

jar包其实是用zip压缩的文件包。我们可以打包自己的package,方便复用,到哪果然,也可以直接引用文件夹(此时注意,必须引用文件夹的根目录,比如文件定义为package mypackage.foo , 那个必须将myapackage这个文件夹连同内部的foo文件一起放在相应的路径上)

制作jar压缩包和解压缩包的命令如下:

 jar -cvf foo.jar foo
其中最后一个参数为需要压缩的文件包。-cvf几个选项中,f必须放在最后,f后面紧跟的必须是output的文件名。v表示输出详细信息(verbose)

对应的解压缩命令为:

 jar -xvf foo.jar

注意其中有个可选的mainifest文件,在META-INF/MANIFEST.MF路径上。

我们可以在manifest.mf文件中加入如下语句

Main-Class: myPackage.MyClass
指定MyClass类为具有main()入口的主类。再利用如下语句,就可以值执行对应的程序了

java -jar foo.jar


命令

javac命令:编译源文件

-classpath 初学者必须掌握的options ,后接类中使用到的第三方类(形式可以是jar或者zip或者直接就是文件包)的目录。linux下,多个目录用冒号 : 分隔。

值得注意的是,-classpath中的内容是会覆盖掉环境变量classpath中的内容的~

-cp 是 -classpath的缩写

-d 制定生成的.class文件存放的目录。

-o 此选项告诉javac优化由内联的static、final以及privite成员函数所产生的码。
-verbose 此选项告知Java显示出有关被编译的源文件和任何被调用类库的信息。比如 -verbose:class 能看到各种类加载的信息。 -verbose:gc是garbage collection的信息。

还有许多option平时用的不多(话说我也其实只是刚会用,并不熟练直接在命令行环境下的调试编译 = =),需要用的时候直接翻阅 man javac 好了。


java 命令:加载运行类文件

-classpath 跟javac中的-classpath同样的道理。

-cp 也就是 -classpath的缩写啦。

-jar 执行在jar包上定义的主类的程序


一个.java文件的编译、运行示例如下:

# javac -classpath ./:/home/username/bin/ThirdParty.jar Hello.java

#java -classpath ./:/home/username/bin/ThirdParty.jar Hello


另外,对于带有package信息的java文件,执行如下:

$ ls .          # Current directory contains the "x" package
x

$ ls x          # The "x" package contains a Sample.java file...
Sample.java

$ cat x/Sample.java   # ...which looks like this.
package x;
public class Sample {
  public static void main(String... args) {
    System.out.println("Hello from Sample class");
  }
}

$ javac x/Sample.java  # Use "/" as delimiter and
            # include the ".java"-suffix when compiling.

$ java x.Sample     # Use "." as delimiter when running, and don't include
            # the ".class" suffix.
Hello from Sample class


误区:

在linux下运行时,添加目录,千万不要弄错分割符。windows下是 \ ,而linux下是 / 。

运行类时,不用加.class。比如有一个类Hello.class,运行命令是 # java Hello 而不是 #java Hello.class 。运行机制中是寻找类,而不是像编译的时候那样找到某个文件。

如果引用的类有package层次,引用的路径是包层次的起点,而不可以延伸到包中的某个目录层次。比如引用了~/workspace目录下的第三方类 com.thirdparty.hello ,在java命令的 -classpath 输入的是第三方类的包的根目录所在位置: #java -classpath ~/workspaceHello,而不能是java -classpath ~/workspace/com/thirdparty Hello。


(暂时也就知道这么多了,这两天仔细研究下,再做补充吧~)

如果还有问题,大家可以多交流啊~

分享到:
评论

相关推荐

    java命令行编译全

    在Java编程中,命令行编译是学习和工作...总之,理解Java的命令行编译和运行机制,特别是涉及到包和类路径的概念,对于任何Java开发者来说都是基础且必要的技能。正确设置和管理类路径,能够确保程序的顺利编译和运行。

    java反编译工具(linux版)

    在本篇中,我们将深入探讨Java反编译的基本概念,以及JD-GUI在Linux环境中的应用。 Java反编译是指将已编译的Java字节码(.class文件)转换回可读的源代码(.java文件)的过程。这通常是为了了解已加密或混淆的代码,...

    java反编译工具linux

    在Linux下,有许多Java反编译工具,例如JD-Core、Procyon、FernFlower等,其中JD-GUI是颇受欢迎的一个。JD-GUI是一个图形用户界面的应用程序,它可以直接打开Java字节码文件,并显示反编译后的源代码。这个工具对于...

    linux下运行java程序

    在Linux环境下运行Java程序是许多开发人员...总的来说,Linux下的Java程序运行涉及到环境配置、程序编译、权限管理以及进程控制等多个方面。了解和掌握这些技能,将有助于你在Linux环境中高效地管理和运行Java应用。

    Java8 Linux版本

    Java 8是Oracle公司推出的Java开发工具包(Java Development Kit...在Linux环境下,了解如何正确安装和配置Java 8 JDK也是每个开发者的基础技能。同时,要关注安全更新,定期检查和更新JDK版本,以防止潜在的安全风险。

    Linux下的java反编译工具

    本文将深入探讨Linux下的一款Java反编译工具——jd-gui,以及相关知识点。 jd-gui是一款图形用户界面的Java反编译工具,它允许开发者查看Java字节码(.class文件)对应的源代码,这对于没有源码的项目或者研究已...

    shell 脚本命令行下编译运行servlet

    用shell写的脚本,用于java web开发时,自动编译运行servlet,速度极快,免除了eclipse慢且不过更新代码和资源的问题。脚本中的路径请自行替换为自己的

    Linux上执行带main方法的java文件

    ### Linux环境下执行含main方法的Java文件详解 #### 标题与描述概述 本文主要介绍如何在Linux系统中执行带有`main`方法的Java文件。通常情况下,在开发环境中可以直接通过IDE或其他工具运行Java应用程序;然而,在...

    关于如何在DOS命令行模式下编译JAVA文件或工程的问题

    在DOS命令行模式下编译Java文件或工程是开发者必备的基本技能,尤其对于那些习惯于命令行操作或者需要在没有图形用户界面的环境中工作的人员来说。以下将详细阐述如何在DOS环境下编译单个Java文件以及整个Java工程。...

    jar在命令行下运行空指针异常解决

    为了有效避免在命令行下运行JAR包时出现空指针异常,正确的Java环境变量配置至关重要。以下是一些关键步骤: 1. **确认JAVA_HOME**:确保系统变量中存在`JAVA_HOME`,并且其值指向安装的JDK或JRE的根目录。例如: ...

    Java文件编译运行操作.pdf

    Java文件的编译和运行是Java编程的基础操作,对于初学者来说,理解这一过程至关重要。在计算机科学领域,特别是Java编程中,我们首先编写源代码(.java文件),然后通过编译器将其转换为可执行的机器代码(.class...

    java编译后的文件上传至linux服务端

    本话题聚焦于如何处理Java编译后的文件,特别是如何将这些文件从本地环境上传至Linux服务器,并在服务器端进行差异分析与统计。 首先,让我们了解一下Java编译过程。在本地开发环境中,我们通常使用JDK(Java ...

    Linux环境下通过c代码获取本机IP

    之前用gethostname和gethostbyname获取本机IP地址运行没有问题,把程序部署到另一台机器上出问题了。在网上找了些例子一样用不了。后找了个能用的,创建一个SOCKET然后获取套接字参数。代码如下: #include #...

    Unix环境上的java编译与运行.

    在Unix环境下进行Java程序的编译与运行是IT专业领域中的一个重要知识点,尤其对于系统管理员、软件开发者以及任何需要在Unix或类Unix操作系统(如Linux)上操作Java应用程序的人员而言,掌握这一技能至关重要。...

    java 反编译工具安装

    Java反编译是将已编译的Java字节码(.class文件)转换回接近原始的Java源代码的过程。这有助于我们理解他人的代码库,或者在没有源代码的情况下进行故障排查。常见的Java反编译工具有JAD、FernFlower、Procyon和JD-GUI...

    java反编译查看

    对于Linux或Mac用户,需要通过命令行运行`java -jar jd-gui.jar`来启动JD-GUI。 3. 启动JD-GUI后,你会看到一个简洁的界面,通常包括一个源代码编辑器和一个文件浏览器。 4. 在文件浏览器中,浏览到包含你需要反编译...

    java反编译优秀软件

    Java反编译是Java开发过程中一个重要的辅助工具,它允许开发者查看和理解已编译的Class文件中的字节码,从而还原出接近源...然而,这也需要开发者具备一定的Java基础知识和理解能力,以便正确地解读反编译出的代码。

    Java反编译工具及安装步骤

    这样,无论在哪个目录下,你都可以直接通过命令行运行jad。 - 在Windows上,打开“系统属性”>“高级”>“环境变量”,在系统变量中找到Path,点击“编辑”,然后添加jad.exe的路径。 - 在Linux或MacOS上,你可以...

    java反编译软件

    Java反编译软件是开发者和逆向工程人员用于查看Java字节码源代码的工具,这对于理解已编译的Java程序、学习库的内部工作原理或者在没有源代码的情况下调试和修复问题非常有用。本文将深入探讨Java反编译的概念、JD-...

    JD-GUI-java反编译工具 | windows版本

    JD-GUI是一个独立的图形实用工具,显示Java源代码 " . class文件。您可以使用JD-GUI浏览重新构建的源代码 用于即时访问方法和字段。 JD-GUI对非商业用途是免费的。这意味着JD-GUI不应该是 包含或嵌入到商业...

Global site tag (gtag.js) - Google Analytics