精华内容
下载资源
问答
  • Linux终端编译java程序

    2018-01-08 13:06:29
    被disni虐了几天,对在终端编译java程序也有了认识,把之前记录的笔记整理了一些出来。最简单的情况最简单的情况是指只有一个.java文件,没有import别的jar包,没有package。比如:这种情况下最简单,直接使用javac...

    最近在看disni,一个基于java语言的RDMA库,给的代码需要在终端编译运行,以前写java程序都是用IDE写,对于如何在终端编译和运行java程序一窍不通啊。

    被disni虐了几天,对在终端编译java程序也有了认识,把之前记录的笔记整理了一些出来。

    最简单的情况

    最简单的情况是指只有一个.java文件,没有import别的jar包,没有package。比如:

    这里写图片描述

    这种情况下最简单,直接使用javac命令就可以了

    这里写图片描述

    依赖其他.jar文件的情况

    这种,在idea或者eclipse下,我们通过在项目中引入相关的jar包就可以了,但是在终端编译时需要在javac指令后面添加相应的参数才可以。

    这里写图片描述

    上图是一个对excel解析的程序,可以看到项目中引入了jxl.jar和poi-3.15.jar文件,我们在终端对Form.java进行编译,首先进入进入src目录

    这里写图片描述

    我们引入两个jar包还好,如果引入多个jar包自然是不合理的。可以采用下面简单一点的办法

    这里写图片描述

    通过-Djava.ext.dirs参数可以指定所有引入jar包所在的目录,并一次把所有的.java文件都编译了。不过这里竟然有个小坑,指定路径的时候使用~竟然会找不到。。。

    在运行的时候,我们依然要指定引入jar所在的位置。
    这里写图片描述

    源码在package中的情况

    上面的Form.java直接在src的根目录,所以在编译的时候还是比较简单的,当源码在src下其他目录时,编译的时候也只需要带上package路径就可以了。

    这里写图片描述

    现在Form.java在/src/com/lab2/ecnu/目录下,我们编译的时候还是在src目录进行。

    这里写图片描述

    这里有一些注意的是,我们甚至可以直接到src/com/lab2/ecnu/目录下编译.java文件,但是不可以在src/com/lab2/ecnu/目录下执行。

    这里写图片描述

    展开全文
  • 现在我有一个在Window上已经完成的java项目,如何不通过eclipse生成jar文件,而是直接将源码传到linux系统上(已有jdk环境)进行编译,并形成可执行文件? 谢谢各位大神了~[img=...
  • 如何Linux中反编译java源代码

    千次阅读 2016-03-01 13:07:39
    怎么用java自带反编译工具查看java字节码文件图文教程,用java自带反编译工具查看java字节码文件,首先,配置好java开发环境,环境变量各种配置,这里就不一一说了,相信大家都配置好了。下面入正题----怎么用java...

    怎么用java自带反编译工具查看java字节码文件图文教程,用java自带反编译工具查看java字节码文件,首先,配置好java开发环境,环境变量各种配置,这里就不一一说了,相信大家都配置好了。下面入正题----怎么用java自带反编译工具查看java字节码文件

    工具/原料

    • javap

    • java+java开发工具

    方法/步骤

    1. 首先,写一个最简单的程序,我们从最简单入手,相信大家1秒就可以看懂了吧

      怎么用java自带反编译工具查看java字节码文件
    2. 然后,经过编译生成HelloWorld.class文件,对,我们就去看HelloWorld.class里面的java字节码,到底是什么。

      输入下图所示的命令,javap  -verbose  HellloWorld  回车,入下图所示。

      怎么用java自带反编译工具查看java字节码文件
    3. 详细代码,如下,没学过编译原理的,建议去学下,去学下编译原理,经常看看,就能看懂了,我和大家都是一样,我也是一名,计算机爱好者,没事,喜欢瞎鼓弄。今天就到这了。怎么用java自带反编译工具查看java字节码文件

      怎么用java自带反编译工具查看java字节码文件
      END

    注意事项

    • 怎么用java自带反编译工具查看java字节码文件图文教程

    • 怎么用java自带反编译工具查看java字节码文件图文教程






    一直在学习Java,碰到了很多问题,碰到了很多关于i++和++i的难题,以及最经典的String str = "abc" 共创建了几个对象的疑难杂症。 知道有一日知道了java的反汇编 命令  javap。现将学习记录做一小结,以供自己以后翻看。如果有错误的地方,请指正

    1.javap是什么:

     where options include:
    -c Disassemble the code
    -classpath <pathlist> Specify where to find user class files
    -extdirs <dirs> Override location of installed extensions
    -help Print this usage message
    -J<flag> Pass <flag> directly to the runtime system
    -l Print line number and local variable tables
    -public Show only public classes and members
    -protected Show protected/public classes and members
    -package Show package/protected/public classes
    and members (default)
    -private Show all classes and members
    -s Print internal type signatures
    -bootclasspath <pathlist> Override location of class files loaded
    by the bootstrap class loader
    -verbose Print stack size, number of locals and args for met
    hods
    If verifying, print reasons for failure 

    以上为百度百科里对它的描述,只是介绍了javap的一些参数和使用方法,而我们要用的就是这一个:-c Disassemble the code。

    明确一个问题:javap是什么?网上有人称之为 反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。

    2.初步认识javap

    从一个最简单的例子开始:

     

     这个例子中,我们只是简单的声明了两个int型变量并赋上初值。下面我们看看javap给我们带来了什么:(当然执行javap命令前,你得首先配置好自己的环境,能用javac编译通过了,即:javac TestJavap.java )

    我们只看(方便起见,将注释写到每句后面)

      Code:
       0:   iconst_2
        //把2放到栈顶
       1:   istore_1    //把栈顶的值放到局部变量1中,即i中
       2:   iconst_3    //把3放到栈顶
       3:   istore_2    //把栈顶的值放到局部变量1中,即j中
       4:   return

    是不是很简单?(当然,估计需要点数据结构的知识) ,那我们就补点java的关于堆栈的知识:

    对于 int i = 2;首先它会在栈中创建一个变量为i的引用,然后查找有没有字面值为2的地址,没找到,就开辟一个存放2这个字面值的地址,然后将i指向2的地址。

    看了这段话,再比较下上面的注释,是不是完全吻合?

    为了验证上面这一说法,我们继续实验:

    我们将 i 和 j的值都设为2。按照以上理论,在声明j的时候,会去栈中招有没有字面值为2的地址,由于在栈中已经有2这个字面值,便将j直接指向2的地址。这样,就出现了i与j同时均指向2的情况。

     拿出javap -c进行反编译:结果如下:

      Code:
       0:   iconst_2    //把2放到栈顶
       1:   istore_1    //把栈顶的值放到局部变量1中,即i中
       2:   iconst_2    //把2放到栈顶
       3:   istore_2    //把栈顶的值放到局部变量2中,即j中(i 和 j同时指向2)
       4:   return

    虽然这里说i和j同时指向2,但这里不等于说i和j指向同一块地址(java是不允许程序员直接修改堆栈中的数据的,所以就不要想着,我是不是可以修改栈中的2,那样岂不是i和j的值都会变化。另:在编译器内部,遇到j=2;时,它就会重新搜索栈中是否有2的字面值,如果没有,重新开辟地址存放2的值;如果已经有了,则直接将j指向这个地址。因此,就算j另被赋值为其他值,如j=4,j值的改变不会影响到i的值。)

    再来一个例子:

    还是javap -c

      Code:
       0:   iconst_2    //把2放到栈顶
       1:   istore_1    //把栈顶的值放到局部变量1中,即i中
       2:   iload_1     //把i的值放到栈顶,也就是说此时栈顶的值是2
       3:   istore_2    //把栈顶的值放到局部变量2中,即j中
       4:   return

    看到这里是不是有点明确了?

     

    既然我们对javap有了一定的了解,那我们就开始用它来解决一些实际的问题:

    1.i++和++i的问题

    反编译结果为

     Code:
      0:   iconst_1
      1:   istore_1
      2:   iinc    1, 1 //这个个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,i此时变成2了
      5:   iconst_1
      6:   istore_2
      7:   iinc    2, 1//这个个指令,把局部变量2,也就是j,增加1,这个指令不会导致栈的变化,j此时变成2了
      10:  return

     

    可以看出,++在前在后,在这段代码中,没有任何不同。

    我们再看另一段代码:

    反编译结果:

      Code:
       0:   iconst_1
       1:   istore_1
       2:   iload_1
       3:   iinc    1, 1  //局部变量1(即i)加1变为2,注意这时栈中仍然是1,没有改变
       6:   istore_1    //把栈顶的值放到局部变量1中,即i这时候由2变成了1
       7:   iconst_1
       8:   istore_2
       9:   iinc    2, 1 //局部变量2(即j)加1变为2,注意这时栈中仍然是1,没有改变
       12:  iload_2    //把局部变量2(即j)的值放到栈顶,此时栈顶的值变为2
       13:  istore_2   //把栈顶的值放到局部变量2中,即j这时候真正由1变成了2
       14:  return

    是否看明白了? 如果这个看明白了,那么下面的一个问题应该就是迎刃而解了:

    m = m ++;这句话,java虚拟机执行时是这样的: m的值加了1,但这是栈中的值还是0, 马上栈中的值覆盖了m,即m变成0,因此不管循环多少次,m都等于0。

    如果改为m = ++m; 程序运行结果就是100了。。。

    展开全文
  • linux 编译java并打包

    2014-11-18 15:49:13
    一、首先是编译简单java文件(不引用外部jar包)如test.java public class test(){ System.out.println("hello world!"); } 一个简单的类,看它是如何打包为jar的 1.第一步:先编译 javac test.java // ...

    一、首先是编译简单java文件(不引用外部jar包)如test.java

    public class test(){
    System.out.println("hello world!");
    }

    一个简单的类,看它是如何打包为jar的

    1.第一步:先编译

    javac  test.java   // 注意路径

    编译后会产生一个test.class 文件

    2.第二步:

    jar -cvf test.jar  test.class

    二。如果是要引用外部jar包该如何打包

    我以hadoop中的WordCount,java 为例:

    可已将指令写成脚本执行:

    脚本如下:

    #!/bin/bash

    HADOOP_VERSION=1.1.2

    HADOOP_HOME=/usr/local/hadoop                                                            //hadoop 安装路径

    Lib=${HADOOP_HOME}/hadoop-core-${HADOOP-VERSION}.jar     // hadoop下的 hadoop-core-1.1.2.jar 包路径

    mkdir my_wordcount

    javac -cp $Lib -d my_wordcount  WordCount.java                             //编译WordCount.java 成生class文件 放入my_wordcount文件夹中              $Lib 引用jar包

    jar -cvf wordcount.jar my_wordcount/.                                            // 用my_wordcount文件下的class文件打包成wordcount.jar

    展开全文
  • 今天学习了如何linux系统上编译Java代码,特转载一篇关于带包的java程序编译运行方法,方便后续复习使用 一、编译单独一个java程序 Hello.java public class Hello{  public static void main(String args[]){...

    今天学习了如何在linux系统上编译Java代码,特转载一篇关于带包的java程序编译运行方法,方便后续复习使用

    一、编译单独一个java程序

    Hello.java

    public class Hello{
        public static void main(String args[]){
            System.out.println("Hello World!");
        }


    xl@ubuntu:~/java$ javac Hello.java        //在当前目录下产生Hello.class文件

    xl@ubuntu:~/java$ ls
    Hello.class  Hello.java
    xl@ubuntu:~/java$ java Hello            // 执行Hello.class
    Hello World!

    二、编译一个带包的java程序
    Hello.java


    package hello.world;
    public class Hello{
        public static void main(String args[]){
            System.out.println("Hello World!");
        }
    }


    xl@ubuntu:~/java$ javac Hello.java              // 在当前目录下产生Hello.class文件
    xl@ubuntu:~/java$ ls
    Hello.class  Hello.java

    xl@ubuntu:~/java$ java Hello                      // 在执行的时候显示找不到Hello这个类,原因是因为程序中包含包hello.world,执行类的时候回去按照这个包的路径来找。因此我们用下面的命令来执行。
    Error: Could not find or load main class Hello

    xl@ubuntu:~/java$ javac -d . Hello.java       //  参数-d 指定生成class文件的位置
    xl@ubuntu:~/java$ ls                                    // 此时我们看到在当前目录下生成了一个目录hello/world/        
    hello  Hello.java
    xl@ubuntu:~/java$ tree hello/ 
    hello/
    └── world
        └── Hello.class
    1 directory, 1 file

    xl@ubuntu:~/java$ java hello.world.Hello   // 执行类的时候需要带上路径
    Hello World!

    三、同一个包下,一个类调用另一个类

    Lance.java 


    package hello.world;
    public class Lance{
        public String getName(){
            return "my name is lance";
        }
    }
    Introduce.java

    package hello.world;
    import hello.world.Lance;
     
    public class Introduce{
        public static void main(String args[]){
            Lance name = new Lance();
            System.out.println("hello world! " + name.getName());
        }
    }


    xl@ubuntu:~/java$ javac -d . Lance.java                // 参数-d . 表示在当前目录下产生hello/world/目录。并且生成Lance.class
    xl@ubuntu:~/java$ javac -cp . -d . Introduce.java   //  参数-cp . 表示按照hello.world.Lance的路径寻找类,并且编译Introduce.java。此时在当前目录下产生hello/world/目录,并且生成Introduce.class
    xl@ubuntu:~/java$ tree hello/
    hello/
    └── world
        ├── Introduce.class
        └── Lance.class

    1 directory, 2 files
    xl@ubuntu:~/java$ java hello.world.Introduce 
    hello world! my name is lance

    四、一个包下的类调用另一个包下的类


    Lance.java 


    package hello.world01;
    public class Lance{
        public String getName(){
            return "my name is lance";
        }
    }
    Introduce.java

    package hello.world02;
    import hello.world01.Lance;
     
    public class Introduce{
        public static void main(String args[]){
            Lance name = new Lance();
            System.out.println("hello world! " + name.getName());
        }
    }

    xl@ubuntu:~/java$ javac -d . Lance.java   // 参数-d . 表示在当前目录下产生hello/world01/目录。并且生成Lance.class
    xl@ubuntu:~/java$ javac -cp . -d . Introduce.java  //  参数-cp . 表示按照hello.world01.Lance的路径寻找类,并且编译Introduce.java。此时在当前目录下产生hello/world02/目录,并且生成Introduce.class
    xl@ubuntu:~/java$ tree hello/
    hello/
    ├── world01
    │   └── Lance.class
    └── world02
        └── Introduce.class


    2 directories, 2 files
    xl@ubuntu:~/java$ java hello.world02.Introduce  // 执行Introduce类的时候需要指定路径
    hello world! my name is lance

    补充:

    一个包的文件都在时运行如下命令进行编译:
    javac -d . *.java

    运行:编译之后会自己生成文件夹,不要进入这个文件夹,直接运行 java -cp /home/test test.Test,其中源文件在 test 文件夹中,包名为 test,启动文件为 Test.java

    展开全文
  • linux如何编译和安装infer

    千次阅读 2016-02-24 22:58:15
    facebook推出infer静态代码检测工具编译和安装是相对复杂的一个操作,官方文档是英文的,安装顺序也有点乱,...依赖插件插件是编译infer的先决条件,linux下需要依赖的插件如下: opam >= 1.2.0 Python 2.7 Java (only
  • Linux编译打包 Java/Scala Maven项目

    千次阅读 2019-04-19 16:19:26
    前言:学习spark时,需要用远程集群来跑项目,因此要了解一下如何编译scala maven项目。但是网上资料好乱啊! 只能自己来写一个符合像我一样情况的初学者。 环境: Scala Version: 2.11.12 Java Version: openjdk ...
  • linuxjava编译出错

    2020-12-02 11:40:41
    <div><p>你好,我在尝试使用GmSSL的java库的时候,参考了文档的方法,...请教如何正确编译java的jni,谢谢!</p><p>该提问来源于开源项目:guanzhi/GmSSL</p></div>
  • 假如你在linux系统下使用Eclipse开发一个Java项目,你可能会有从其他地方远程连接这个项目的需求。或许 你可以使用teamviewer远程连接linux桌面,但那经常会非常龟速。...本文就是告诉你如何在终端中编译运行ecli...
  • 如果要在Linux系统下的Eclipse中开发Java项目,则可能要从另一个位置远程访问该项目。...这篇文章向您展示了如何在终端中编译和运行Eclipse项目。 使用的命令行 基本上,您需要以下两个命令。-cp选项配置类...
  • 如何linux下开发java程序

    千次阅读 2020-06-22 16:07:26
    如何linux下开发java程序,或者更具体一点在linux开发java SDK, 首先明确一下几点 开发工具 如果编译 如何运行 如果写单侧 开发工具 编辑器: 可以直接安装PowerVim,这里开发工具已经配置好了 PowerVim主要做...
  • Linux如何编译CPP程序 一、GCC GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3...
  • GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放...
  • 原文:http://blog.lupaworld.com/home-space-uid-24466-do-blog-id-2578.html 已经学会如何在Windows下如何编辑,编译和执行Java程序了,我就想试试如何Linux编译和执行Linux。 昨天下载了一个for Linux 的...
  • 一、前言 最近在学习java,不过一直是在windows的eclipse上做开发。服务器一般都是linux,...本文主要是讲讲如何通过脚本编译和运行java程序的。 二、知识点 1、编译命令 javac [-d] [-o] [-verbose] [-clas...
  • Linux如何编译并运行C程序

    千次阅读 2019-04-25 15:09:56
    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放...
  • 1、Windows上使用eclipse编译java工程,编译完成后导出为Runnable JAR File 例如,此处将test工程中的Test2文件export为MyTest2.jar文件 2、Ubuntu上java环境安装 ①jdk官网...
  • GCC,GNU Compiler Collection是linux下最主要的编译工具GCC不仅功能非常强大结构也异常灵活。它可以通过不同的前端模块来支持各种语言如Java、Fortran、Pascal、Modula-3和Ada。g++是GCC中的一个工具专门来编译C++...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 632
精华内容 252
关键字:

linux如何编译java

java 订阅
linux 订阅