真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

自動編譯java代碼腳本 java腳本編程

如何在MyEclipse中編譯java程序,如何運行java程序

第一種方法:

目前成都創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、郊區(qū)網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1、右擊要運行的java程序的文件;

2、選擇Run As;

3、再選擇Java Application即可運行。

第二種方法:(使用MyEclipse的快捷鍵)

1、先打開要運行的Java文件;

2、查看MyEclipse上方菜單欄,會發(fā)現(xiàn)有一個綠色圓形里面包裹著一個三角形的按鈕;

3、點擊2步驟的按鈕即可運行java程序。

注意:運行java程序的前提是這個java文件中必須有主方法(即public static void main(String[] args)這個方法),否則沒有主方法運行不了程序。

如何用maven將java8寫的代碼編譯為java6平臺的

在一般的Java應(yīng)用開發(fā)過程中,開發(fā)人員使用Java的方式比較簡單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運行Java 程序就可以了。這種開發(fā)模式背后的過程是:開發(fā)人員編寫的是Java源代碼文件(.java),IDE會負責(zé)調(diào)用Java的編譯器把Java源代碼編譯成平臺無關(guān)的字節(jié)代碼(byte code),以類文件的形式保存在磁盤上(.class)。Java虛擬機(JVM)會負責(zé)把Java字節(jié)代碼加載并執(zhí)行。Java通過這種方式來實現(xiàn)其“編寫一次,到處運行(Write once, run anywhere)” 的目標(biāo)。Java類文件中包含的字節(jié)代碼可以被不同平臺上的JVM所使用。Java字節(jié)代碼不僅可以以文件形式存在于磁盤上,也可以通過網(wǎng)絡(luò)方式來下載,還可以只存在于內(nèi)存中。JVM中的類加載器會負責(zé)從包含字節(jié)代碼的字節(jié)數(shù)組(byte[])中定義出Java類。在某些情況下,可能會需要動態(tài)的生成 Java字節(jié)代碼,或是對已有的Java字節(jié)代碼進行修改。這個時候就需要用到本文中將要介紹的相關(guān)技術(shù)。首先介紹一下如何動態(tài)編譯Java源文件。

動態(tài)編譯Java源文件

在一般情況下,開發(fā)人員都是在程序運行之前就編寫完成了全部的Java源代碼并且成功編譯。對有些應(yīng)用來說,Java源代碼的內(nèi)容在運行時刻才能確定。這個時候就需要動態(tài)編譯源代碼來生成Java字節(jié)代碼,再由JVM來加載執(zhí)行。典型的場景是很多算法競賽的在線評測系統(tǒng)(如PKU JudgeOnline),允許用戶上傳Java代碼,由系統(tǒng)在后臺編譯、運行并進行判定。在動態(tài)編譯Java源文件時,使用的做法是直接在程序中調(diào)用Java編譯器。

JSR 199引入了Java編譯器API。如果使用JDK 6的話,可以通過此API來動態(tài)編譯Java代碼。比如下面的代碼用來動態(tài)編譯最簡單的Hello World類。該Java類的代碼是保存在一個字符串中的。

01 public class CompilerTest {

02 public static void main(String[] args) throws Exception {

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

04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);

07 Iterable extends JavaFileObject fileObjects = Arrays.asList(sourceObject);

08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);

09 boolean result = task.call();

10 if (result) {

11 System.out.println("編譯成功。");

12 }

13 }

14

15 static class StringSourceJavaObject extends SimpleJavaFileObject {

16

17 private String content = null;

18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {

19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);

20 this.content = content;

21 }

22

23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {

24 return content;

25 }

26 }

27 }

如果不能使用JDK 6提供的Java編譯器API的話,可以使用JDK中的工具類com.sun.tools.javac.Main,不過該工具類只能編譯存放在磁盤上的文件,類似于直接使用javac命令。

另外一個可用的工具是Eclipse JDT Core提供的編譯器。這是Eclipse Java開發(fā)環(huán)境使用的增量式Java編譯器,支持運行和調(diào)試有錯誤的代碼。該編譯器也可以單獨使用。Play框架在內(nèi)部使用了JDT的編譯器來動態(tài)編譯Java源代碼。在開發(fā)模式下,Play框架會定期掃描項目中的Java源代碼文件,一旦發(fā)現(xiàn)有修改,會自動編譯 Java源代碼。因此在修改代碼之后,刷新頁面就可以看到變化。使用這些動態(tài)編譯的方式的時候,需要確保JDK中的tools.jar在應(yīng)用的 CLASSPATH中。

下面介紹一個例子,是關(guān)于如何在Java里面做四則運算,比如求出來(3+4)*7-10的值。一般的做法是分析輸入的運算表達式,自己來模擬計算過程??紤]到括號的存在和運算符的優(yōu)先級等問題,這樣的計算過程會比較復(fù)雜,而且容易出錯。另外一種做法是可以用JSR 223引入的腳本語言支持,直接把輸入的表達式當(dāng)做JavaScript或是JavaFX腳本來執(zhí)行,得到結(jié)果。下面的代碼使用的做法是動態(tài)生成Java源代碼并編譯,接著加載Java類來執(zhí)行并獲取結(jié)果。這種做法完全使用Java來實現(xiàn)。

01 private static double calculate(String expr) throws CalculationException {

02 String className = "CalculatorMain";

03 String methodName = "calculate";

04 String source = "public class " + className

05 + " { public static double " + methodName + "() { return " + expr +"; } }";

06 //省略動態(tài)編譯Java源代碼的相關(guān)代碼,參見上一節(jié)

07 boolean result = task.call();

08 if (result) {

09 ClassLoader loader = Calculator.class.getClassLoader();

10 try {

11 Class? clazz = loader.loadClass(className);

12 Method method = clazz.getMethod(methodName, new Class?[] {});

13 Object value = method.invoke(null, new Object[] {});

14 return (Double) value;

15 } catch (Exception e) {

16 throw new CalculationException("內(nèi)部錯誤。");

17 }

18 } else {

19 throw new CalculationException("錯誤的表達式。");

20 }

21 }

上面的代碼給出了使用動態(tài)生成的Java字節(jié)代碼的基本模式,即通過類加載器來加載字節(jié)代碼,創(chuàng)建Java類的對象的實例,再通過Java反射API來調(diào)用對象中的方法。

Java字節(jié)代碼增強

Java 字節(jié)代碼增強指的是在Java字節(jié)代碼生成之后,對其進行修改,增強其功能。這種做法相當(dāng)于對應(yīng)用程序的二進制文件進行修改。在很多Java框架中都可以見到這種實現(xiàn)方式。Java字節(jié)代碼增強通常與Java源文件中的注解(annotation)一塊使用。注解在Java源代碼中聲明了需要增強的行為及相關(guān)的元數(shù)據(jù),由框架在運行時刻完成對字節(jié)代碼的增強。Java字節(jié)代碼增強應(yīng)用的場景比較多,一般都集中在減少冗余代碼和對開發(fā)人員屏蔽底層的實現(xiàn)細節(jié)上。用過JavaBeans的人可能對其中那些必須添加的getter/setter方法感到很繁瑣,并且難以維護。而通過字節(jié)代碼增強,開發(fā)人員只需要聲明Bean中的屬性即可,getter/setter方法可以通過修改字節(jié)代碼來自動添加。用過JPA的人,在調(diào)試程序的時候,會發(fā)現(xiàn)實體類中被添加了一些額外的 域和方法。這些域和方法是在運行時刻由JPA的實現(xiàn)動態(tài)添加的。字節(jié)代碼增強在面向方面編程(AOP)的一些實現(xiàn)中也有使用。

java腳本怎樣編譯

要有JDK才可以編譯,及設(shè)定好Path設(shè)定,然後在該目錄下Javac xxx.java。

用shell腳本怎樣編譯java工程

用shell腳本怎樣編譯java工程

編譯java工程一般直接用IDE或者用Ant、Maven之類的工具,很少有人用純shell來編譯java工程。正好遇到這樣一個應(yīng)該,用這篇博文做一下記錄。

案例:用eclipse寫了一個java project,然后編譯打成jar包。

這個可以采用eclipse自帶的Export就可以導(dǎo)出jar了。但是為了軟件自動化等巴拉巴拉的原因,采用存shell腳本編譯。

如圖所示,java project的名稱為iec104,下面src是源文件目錄,bin是所引用的jar包目錄,現(xiàn)在要進行編譯,并且打成jar,如果對jar有所了解,都知道jar有個MANIFEST.MF文件,iec104工程的MF文件內(nèi)容如下:

就是制定了運行的main-class(有public static void main(String args[])的類)。

將這個文件拷貝到iec104的根目錄下,然后執(zhí)行腳本compile.sh,內(nèi)容如下:

#!/bin/bash

cur_dir=$(pwd)

echo $cur_dir

function do_compile_iec104(){

# ? ?echo $cur_dir

iec104=$cur_dir/iec104

iec104_src=$cur_dir/iec104/src

iec104_bin=$cur_dir/iec104/bin

# ? ?echo $iec104_src

# ? ?echo $iec104_bin

iec104_class=$cur_dir/iec104/class

# 將iec104的src目錄下的所有java文件的名稱存入到iec104/src/sources.list文件中

rm -rf $iec104_src/sources.list

find $iec104_src -name "*.java" $iec104_src/sources.list

cat ?$iec104_src/sources.list

# $iec104_class是存放編譯的class文件的目錄

rm -rf $iec104_class

mkdir $iec104_class

# 這里開始編譯java文件,注意這里的-encoding utf-8,剛開始并沒有加入這個,然后就報了一堆錯誤,糾結(jié)了很久才發(fā)現(xiàn),這里給各位提個醒了。

javac -d $iec104_class -encoding utf-8 -classpath $iec104_bin/classes12.jar:$iec104_bin/junit-4.10.jar:$iec104_bin/log4j-1.2.17.jar:$iec104_bin/mysql-connector-java-5.0.5-bin.jar:$iec104_bin/RXTXcomm.jar -g -sourcepath $iec104_src @$iec104_src/sources.list

# 由于用到了log4j,所以要將log4j的配置文件一并放入,如果沒有用到,可以忽略這句

cp $iec104_src/log4j.properties $iec104_class

# 如果原來在iec104目錄下有jar報就刪除掉,因為要生成新的

rm $iec104/iec104.jar

# 這里要cd到存放class的目錄,否則如果采用絕對路徑編譯,編譯出來的jar包里面就是絕對路徑了,這樣就會有問題

# jar -cvfm $iec104/iec104.jar $iec104/MANIFEST.MF $iec104_class/*這樣是錯誤的

cd $iec104_class

jar -cvfm $iec104/iec104.jar $iec104/MANIFEST.MF *

# 賦予可執(zhí)行權(quán)限

sudo chmod a+x $iec104/iec104.jar

}

do_compile_iec104

exit 0

運行這個腳本(linux下)就可以編譯并且在iec104的目錄下就可以看到iec104.jar文件了。

這里補充下java命令的基本知識:

javac 用于編譯Java文件,格式為:

java [options] [sourcefiles] [@files]

其中:

options:命令行選項;

sourcefiles:一個或多個要編譯的源文件;

@files:一個或多個對源文件進行列表的文件,有時候要編譯的文件很多,一個個敲命令會顯得很長,也不方便修改,可以把要編譯的源文件列在文件中,在文件名前加@,這樣就可以對多個文件進行編譯,對編譯一個工程很有用,方便,省事。

有幾個比較重要的選項:

-d 用于指定編譯成的class文件的存放位置,缺省情況下不指定class文件的存放目錄,編譯的class文件將和源文件在同一目錄下;

-classpath 可以簡寫成-cp,用于搜索編譯所需的class文件,指出編譯所用到的class文件的位置,如jar、zip或者其他包含class文件的目錄,指定該選項會覆蓋CLASSPATH的設(shè)定;

-sourcepath用于搜索編譯所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目錄;

需要注意windows下和linux下文件路徑分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的區(qū)別:

windows下文件路徑分隔符用 \ ,文件列表分隔符用分號 ;

linux下文件路徑分隔符用 / ,文件列表分隔符用冒號 :


文章名稱:自動編譯java代碼腳本 java腳本編程
當(dāng)前路徑:http://weahome.cn/article/dooicec.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部