1. 程式人生 > >ubuntu下使用java、javac命令列編譯工程

ubuntu下使用java、javac命令列編譯工程

一、java和javac命令列

(1)javac命令列

javac.exe用於編譯java原始檔,生成.class檔案

語法:javac  [option]  source

常用的[option]選項:

A、-classpath  <路徑>(-cp縮寫):指定要使用的類路徑或要使用的jar包的路徑(jar檔案、zip檔案(裡面都是錯啦搜尋檔案)),使用後

       會覆蓋CLASSPATH的設定

B、-d  <路徑> :指定原始檔編譯後生成.class檔案的存放位置

(2)java命令列

java.exe用於執行javac編譯後生成的.class檔案

語法:java   [option]  classname  [arguments]

常用的[option]選項:

A、-classpath  <路徑>(-cp縮寫):指定要使用的類路徑或要使用的jar包的路徑(jar檔案、zip檔案(裡面都是錯啦搜尋檔案)),使用後

       會覆蓋CLASSPATH的設定

B、[arguments]:傳遞給main函式的引數

二、例子

(1)單獨一個java程式

Demo.java

public class Demo{
    public static void main(String args[]){
               System.out.println("This is a test");
 }
}

javac  Demo.java-----------在當前目錄下生成Demo.class檔案

java Demo-------------------執行Demo.class

也可以通過-d選項指定生成.class檔案的位置,如:

javac -d  ..  Demo.java ,則就會在當前目錄的上一級目錄上生成Demo.class檔案,那麼執行的時候,就要指定class的路徑

java  -cp  ..  Demo,表示讓java在上一級目錄搜尋類檔案

(2)一個帶包的java程式

Demo.java

package com.demo;
public class Demo{
    public static void main(String args[]){
               System.out.println("This is a test");
 }
}
同樣,現編譯檔案:

javac  Demo.java-----------在當前目錄下生成Demo.class檔案

java Demo-------------------執行Demo.class

也可以通過-d選項指定生成.class檔案的位置,如:

javac -d .  Demo.java-----------按照com.demo的包路徑儲存.class檔案

則會在當前目錄下生成一個com/demo/Demo.class檔案,如下圖:

那麼在執行的時候,也要指定類檔案的路徑:

javac  com/demo/Demo或者javac   com.demo.Demo

(3)同一個包下,一個類呼叫另一個類

Tom.java

package com.demo;
public class Tom{
    public String  getMyname(){
    return "This is Tom!";
}
}

Friend.java

package com.demo;

import com.demo.Tom;

public class Friend{
    public static void main(String args[]){
        Tom tom = new Tom();
        System.out.println("hello "+tom.getMyname());
}
}
由於Friend類條用了Tom類,首先要現編譯Tom.java:javac -d  .   Tom.java,然會會按照包結構生成com/demo/Tom.class檔案。

接下來編譯Friend.java檔案:javac  -cp .  -d .  Friend.java,javac會根據,import com.demo.Tom;這個路徑到 -cp 指示的 "."當前目錄下尋找,然後按照包結構生成com/demo/Friend.class,見下圖:

執行:java   com.demo.Friend

(4)一個包下的類條用另一個包下的類


Tom.java

package com.demo1;
public class Tom{
    public String  getMyname(){
    return "This is Tom!";
}
}

Friend.java

package com.demo2;

import com.demo1.Tom;

public class Friend{
    public static void main(String args[]){
        Tom tom = new Tom();
        System.out.println("hello "+tom.getMyname());
}
}
還是一樣,現編譯Tom.java,javac -d .  Tom.java,生成com/demo1/Tom.class;

然後編譯Friend.java,javac   -cp .  -d  .   Friend.java,生成com/demo2/Friend.class;


執行:java  com.demo2.Friend;

(5)更接近專案的java工程

一般,一個工程下面都會有lib(引入的必要jar包),classes(儲存.class檔案),src(.java原始碼)三個資料夾。

java資料夾的目錄結構如下,檔案之間的關係是Client.java呼叫了DemoService.java的方法;ServerImpl.java呼叫了DemoService.java的方法;Server.java呼叫了ServerImpl.java和DemoService.java的方法;

下面的檔案,我只顯示他們引用的包和類。

src/com/client/Client.java:

package com.client;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import com.demo.DemoService;
 

public class Client {
	
	.................................................................................

}
src/com/demo/DemoService.java:
/**
 * Autogenerated by Thrift Compiler (0.9.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */

package com.demo;
import org.apache.thrift.scheme.IScheme;
import org.apache.thrift.scheme.SchemeFactory;
import org.apache.thrift.scheme.StandardScheme;

import org.apache.thrift.scheme.TupleScheme;
import org.apache.thrift.protocol.TTupleProtocol;
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.EncodingUtils;
import org.apache.thrift.TException;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import java.util.Collections;
import java.util.BitSet;
import java.nio.ByteBuffer;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DemoService {
.................................................................
}
src/com/server/Server.java:
package com.server;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

import com.demo.DemoService;
import com.server.ServerImpl;

public class Server {
	
..................................................................................

}
make.sh指令碼如下:
#!/bin/bash

# Get current position
TOP_DIR=$(pwd)

# Add all necessary jars
LIBPATH=lib/commons-codec-1.6.jar:lib/commons-logging-1.1.1.jar:lib/httpclient-4.2.5.jar:lib/httpcore-4.2.4.jar:lib/junit-4.4.jar:lib/libthrift-1.0.0.jar:lib/log4j-1.2.14.jar:lib/servlet-api-2.5.jar:lib/slf4j-api-1.5.8.jar:lib/slf4j-log4j12-1.5.8.jar

#compile java file
javac -cp $LIBPATH                  src/com/demo/DemoService.java  -d ./classes/. 
javac -cp $TOP_DIR/classes:$LIBPATH src/com/server/ServerImpl.java -d ./classes/.
javac -cp $TOP_DIR/classes:$LIBPATH src/com/server/Server.java     -d ./classes/.
javac -cp $TOP_DIR/classes:$LIBPATH src/com/client/Client.java     -d ./classes/.

run.sh指令碼如下:
#!/bin/bash

#Get client/server
SIDE=$1

# Get current position
TOP_DIR=$(pwd)

# Add all necessary jars
LIBPATH=lib/commons-codec-1.6.jar:lib/commons-logging-1.1.1.jar:lib/httpclient-4.2.5.jar:lib/httpcore-4.2.4.jar:lib/junit-4.4.jar:lib/libthrift-1.0.0.jar:lib/log4j-1.2.14.jar:lib/servlet-api-2.5.jar:lib/slf4j-api-1.5.8.jar:lib/slf4j-log4j12-1.5.8.jar

#run program
if [ $SIDE == "server" ];then
    java -cp $TOP_DIR/classes:$LIBPATH  com/server/Server
else
    java -cp $TOP_DIR/classes:$LIBPATH  com/client/Client
fi

進入thriftDemo資料夾下,執行./make.sh指令碼,在classes資料夾下生成的檔案如下:

參考:wenku.baidu.com/view/f4c19dbc65ce0508763213c6.html