2014-11-03 111 views
1
一個弗雷格項目的罐

我想:建築用搖籃

  1. 使用弗雷格的編程語言來編寫一個簡單的「Hello World」的一段代碼,
  2. 然後使用弗雷格編譯器生成等效的Java源代碼,
  3. 然後構建一個可執行的Jar文件從命令行運行,
  4. 所有先前的步驟應該由Gradle「控制」。

我能夠生成源代碼(上一個列表中的項目1和2),但我不能在輸出中指定Java源代碼的「包」結構,即我可以沒有看到package Java語句作爲生成Java源代碼中的第一行代碼。我可以向Frege編譯器指定放置生成代碼的位置(通過參數-d)。

我認爲這就是爲什麼當構建一個可執行Jar,然後啓動它時,我看到類似的錯誤(根據對Gradle任務的不同嘗試),例如:no main manifest attribute

將Frege源代碼保存在名爲HelloFrege.fr的文件中,生成的Java源代碼位於名爲HelloFrege.java的文件中(我驗證該文件包含預期的main方法)。

這裏還有的搖籃「jar任務」的一個版本:

//create a single Jar with all dependencies 
task fatJar(type: Jar) { 
    manifest { 
     attributes 'Implementation-Title': 'Hello Frege Jar Example', 
        'Implementation-Version': version, 
        'Main-Class': 'HelloFrege' 
    } 
    baseName = project.name + '-all' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 
} 

這裏還有的搖籃「罐」任務的另一個版本:

jar { 
    manifest { 
     attributes 'Main-Class': 'HelloFrege' 
    } 
} 

我怎樣才能解決這個問題?我想避免手動將包引用添加到自動生成的Java源代碼文件。

回答

2

如果您在Frege中的模塊名稱不合格,例如HelloWorld,您將看不到Java中生成的軟件包語句。模塊名稱將成爲類名稱,並且包將爲空或默認包。

如果您的模塊名稱是合格的,例如foo.bar.HelloWorld,那麼foo.bar將是軟件包名稱,HelloWorld將是生成的Java源代碼中的類名稱。

規則是,模塊名稱的最後部分成爲類名稱,限定符形成生成的Java源代碼包中的名稱。

1

我不知道什麼gradle這個可以在這方面爲你做什麼,但沒有gradle這個,下面應該至少是可能的:

... build your jar, as before ... 
jar -uvfe project-all.jar HelloFrege 
java -jar project-all.jar # run it 

這,當然,僅僅是另一種方式來創建清單。如果這樣做,那麼現在就該調查爲什麼Gradle拒絕這麼做了。

Postscriptum:在考慮了一下問題後,我想你可能會認爲源文件名/路徑與java包名有關。在Frege中並不是這樣,儘管讓文件路徑與包名匹配並且文件基名與類名相匹配是很好的做法(就像在Java中一樣)。此外,爲了消除一些混淆,請使用模塊關鍵字。正如Marimuthu所解釋的那樣,Java包和類名是從frege模塊名稱派生的。

例子:

$ cat Foo.fr 
module my.org.Baz where 
... 
$ java -jar fregec.jar -d bin Foo.fr 

由此,在包my.orgBaz類,並創建bin/my/org/Baz.class

0

類文件,我至今張貼在這裏我的發現。這對我的作品搖籃命令的組合是一個(在命令行中鍵入gradle clean generateJavaSrcFromFregeSrc fatJar調用它)以下:

task generateJavaSrcFromFregeSrc { 
    ant.java(jar:"lib/frege3.21.586-g026e8d7.jar",fork:true) { 
    arg(value: "-j") // do not run the java compiler 
    arg(value: "-d") 
    arg(value: "src/main/java") // the place where to put the generated source code (paired to the -d argument) 
    arg(value: "src/main/frege/HelloFrege.fr") 
    } 
} 

jar { 
    manifest { 
     attributes 'Main-Class': 'org.wathever.HelloFrege' 
    } 
} 

task fatJar(type: Jar) { 
    from files(sourceSets.main.output.classesDir) 
    from files(sourceSets.main.output.resourcesDir) 
    //from {configurations.compile.collect {zipTree(it)}} // this does not include the autogenerated source code 
    baseName = project.name + '-fatJar' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 
} 
  • 清單細節需要在代碼的jar塊被指定,如果我指定他們在task fatJar然後當運行的罐子我得到no main manifest attribute, in [...]
  • 如果我使用的代碼jar只是塊與物業from("$projectDir") { include 'lib/**'}以包括弗雷格罐子,然後我得到這樣的錯誤java.lang.ClassNotFoundException(我想是因爲被包含的Jar因爲它而不是一組.class文件)。
  • src/main/java/org/wathever需要運行搖籃之前趕到那裏的文件夾(附加信息:使用Maven約定前綴src/main/java作爲後綴爲HelloFrege.fr源代碼中指定的「Java包」:module org.wathever.HelloFrege where

一些有用的細節我發現:

+0

但是請注意,你不能在一般的使用-j標誌。例如,當A依賴於B時,編譯器A編譯器將需要B的類文件。 – Ingo 2014-11-04 08:08:01