一---Android-SDK系列文章(3) ---java(自己动手编译、运行Java程序)

一、开发环境

1.集成开发环境

       配置Java运行时环境(JDK)、Eclipse、NetBeans这些开发工具


2.独立开发环境

       仅需要配置Java运行时环境(JDK):

             (1)下载jdk解压;

             (2)修改环境参数/etc/bash.bashrc:

                #add fot aosp build tony/2015/1/13
                export JAVA_HOME=/opt/java/jdk1.6.0_45
                export JRE_HOME=$JAVA_HOME/jre
                export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
                export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME/lib:$JAVA_HOME


二、代码的编译以及运行

       对于写Java程序而言,我们主张源文件与class文件都有相同的目录结构,这样不仅会方便代码的组织管理,也使得在编译以及运行Java程序时少犯错误。


1:位于默认包下的文件的编译以及运行(没有显式写package.java文件文件都是属于默认包的)

     (1)查看源文件Test.java   &&  A.java

             (我们发现这两个Java文件中并没有package语句,所以这两个文件同属于一个默认包中。)

       

         

//src/Test.java

public class Test {
    public  static void main(String[] args){
        A a = new A();
        a.setValue(10);
        System.out.println(a.getValue());
    }
}

//src/A.java
class A{

    private int value;
    
    public A(){
        value = 0;
    }
    
    public void setValue(int var){
        value = var;
    }
    
    public int getValue(){
        return value;
    }

}

     (2)编译java:javac  Test.java

       


       

     (3)运行java:java  Test

       


2:位于自定义package(包)的文件的编译以及运行(显式写package)

(1)查看源文件Test.java   &&  A.java


///src/a_package/A.java

package  a_package;///使用package

public class A{

    private int value;
    
    public A(){
        value = 0;
    }
    
    public void setValue(int var){
        value = var;
    }
    
    public int getValue(){
        return value;
    }

}

///src/Test.java

import  a_package.*;///使用package

public class Test{
    public void static void main(String[] args){
        A a = new A();
        a.setValue(10);
        System.out.println(a.getValue());
    }
}


(2)编译java:javac  Test.java

        

         要想成功编译java文件,需要有classpath  和   PACKAGE 包名的共同配合。

         .CLASS类发现规则:class文件所在目录 = classpath + '\' + 包名(包名中的'.'全变成'\')

          !!!!!Java就是靠这个规则来寻找需要的class文件的。

               

        


(3)运行java:java  Test

       

        运行指定了package程序时,需要显示的写出其包名,即:java   packagename.classname,其遵循与class文件一样的寻找规则,即在classpath+packagename中'.'变成'\' 所表示的路径下能够找到相应的classname所指的class文件。


三、关于JAR包:如何打jar包以及使用jar包

0.何为jar包?

       JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。

       JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。


1.如何打jar包--概述?(参见:http://lishumingwm163-com.iteye.com/blog/954061)

(1)打包根目录下面的文件:   jar  cvf   filename.jar   a.class   b.class 

(2)打包带package的文件:jar cvf filename.jar   foldername 或  jar cvf filename.jar foldername\*

(3)打包可执行jar包(有main入口的):

         A.先配置manifest.mf文件,内容如下:

         Main-Class: com.TestBean///指定入口函数,说明默认执行com.TestBean的main函数。
         Class-Path: lib\classes12.jar///配置依赖jar包

         B.打包方法:jar  cvfm    filename.jar manifest.mf(指定配置文件) *.class(class包)     lib\classes12.jar(依赖包) 

                              或者同(2)

         C.执行方法:java -jar filename.jar


下面一一介绍。


2.打包jar包  以及  使用jar包?(针对属于默认包的class文件打包:无package显示)

(1)打包:(前提是:已经编译完成的class文件(含java源文件)

A.java源文件如下:

public class A{

    private int value;
    
    public A(){
        value = 0;
    }
    
    public void setValue(int var){
        value = var;
    }
    
    public int getValue(){
        return value;
    }

}


                   

              

打包命令:

           tonylau@tonylau-OptiPlex-780:~/test-jar-1$jar -cvf test.jar A.class
           added manifest
           adding: A.class(in = 345) (out= 248)(deflated 28%)
           tonylau@tonylau-OptiPlex-780:~/test-jar-1$

                            

(2)使用jar包:如果对属于默认包的class文件打包,则只要把jar包路径添加到classpath中即可使用,无需再在程序中使用import。测试实例如下:


test_jar.java
public class test_jar{

    public static void main(String[] args){
        A a = new A();
    }
}




3.打包jar包  以及  使用jar包?(针对属于非默认包的class文件打包:有package显示)

(1)将要打包成jar的package:a_package  (其下) 以及  测试(使用jar包)的测试程序test_jar_package.java

        


        


      

<span style="font-size:18px;">//D:<span style="font-size:18px;">a_package</span>/A.java
package <span style="font-size:18px;"> a_package</span>;
public class A{

    private int value;
    
    public A(){
        value = 0;
    }
    
    public void setValue(int var){
        value = var;
    }
    
    public int getValue(){
        return value;
    }

}</span>



(2)打包jar包:jar -cvf a-package.jar a_package/(前提是a-package文件夹下的A.java 已经编译完成如(1)所示)

        (!如果对属于默认包的class文件打包,则只要把jar包路径添加到classpath中即可使用,无需再在程序中使用import!)

     


     打包后的jar文件是:a-package.jar

         


     该jar包的具体组成是:

        


(3)测试实例------编译运行测试程序:使用jar包

       import a_package.*;/必须得有此import,因为A.class位于a_package包中。如果不写则编译不通过。
                                        ///!如果对属于默认包的class文件打包,则只要把jar包路径添加到classpath中即可使用,

                                        ///无需再在程序中使用import!)
       public class Test{
                  public  static void main(String[] args){
                 A a = new A();
                 a.setValue(10);
                 System.out.println(a.getValue());
                 }
          }

        

        



4.打包jar包  以及 使用jar包?(可以直接运行的jar包: java -jar  test.jar=====必须保证有main()入口

(可以参见:http://jingyan.baidu.com/article/3c48dd344a2146e10be3588c.html


(1)待测试源码的编译:

         

///test/test_jar.java
package test;   //指定上级文件夹(package)的名字
public class test_jar{

    public static void main(String[] args){

         System.out.println("hello jar...!");  
    }
}


///javac  test_jar.java


(2)打包已经编译好的源码为jar包(jar cvf my-test.jar test/)

                           


                             


(3)修改manifest脚本:添加主函数入口(main)---即添加最后一行(注意:后有空格额!)

打开可以使用


(4)运行jar 文件(java -jar my-test.jar)



四、利用Makefile自动编译运行Java程序


      下面给出一个简单的例子:这个例子中,没有手动设置Windows的环境变量,而是用-classpath指定,这样方便在不同机器之间移植。



1.项目结构

(1)make 前(编译前)(只含有java源文件和某些目录)


(2)make 后(编译后)(包含最终生成的class文件)



2.项目源码

<span style="font-size:18px;">//A.java
package package1;
public class A{

    private int value;
    
    public A(){ value = 0; }
    
    public void setValue(int var){
        value = var;
    }
    
    public int getValue(){
        return value;
    }
}

//B.java
package package1;
public class B{

    private String name;
    
    public B(){ name = null; }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }

}

//C.java
package package2;
public class C{

    private String name;
    
    public C(){ name = null; }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }

}

//Test.java
import java.util.*;
import package1.*;
import package2.*;
public class Test{

    public static void main(String[] args){

        A a = new A();
        B b = new B();
        C c = new C();
        
        a.setValue(3);
        b.setName("Java");
        c.setName("Test");
        
        System.out.println(a.getValue());
        System.out.println(b.getName());
        System.out.println(c.getName());
    }
}</span>

<span style="font-size:18px;">//Makefile
target:
    javac ./package1/A.java -d ../classes
    javac ./package1/B.java -d ../classes
    javac ./package2/C.java -d ../classes
    javac ./main/Test.java  -d ../classes/main/ -classpath ../classes
run:
    java -classpath ../classes/main;../classes Test
clean:
    rm -rf ../classes/package1/*.class
    rm -rf ../classes/package2/*.class
    rm -rf ../classes/main/*.class</span>

解析makefile:编译/运行java文件时,都可能需要用到 .class 文件,因此需要指定classpath的路径




3.项目编译&&运行


(1)编译:

make
D:\Java\project\src>make
javac ./package1/A.java -d ../classes
javac ./package1/B.java -d ../classes
javac ./package2/C.java -d ../classes
javac ./main/Test.java -d ../classes/main/ -classpath ../classes


(2)运行:

make run

D:\Java\project\src>make run
java -classpath ../classes/main;../classes Test
3
Java
Test



        这样,其实我们完全可以不用Eclipse、Netbeans等开发工具就能自己编译运行自己的系统了。当然这仅仅是限于小工程或是更好的理解编译/运行java程序的过程,对于大型工程还是需要IDE 工具开发,以提高效率。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值