我的NetBeans 6.8,我寫了有兩個庫(JAR文件)一類。 構建它,我用我的project.jar和包含兩個lib jar文件的「lib」文件夾得到一個「dist」文件夾。
我怎麼能在一個jar文件中得到這一切? (我不使用Maven/Ant或類似的東西。)
我的NetBeans 6.8,我寫了有兩個庫(JAR文件)一類。 構建它,我用我的project.jar和包含兩個lib jar文件的「lib」文件夾得到一個「dist」文件夾。
我怎麼能在一個jar文件中得到這一切? (我不使用Maven/Ant或類似的東西。)
基本的問題是,當前版本的Java不支持開箱即用的JAR。
建議的解決方案是使用jar中MANIFEST.MF文件中的Class-Path行指向所需的庫(允許相對路徑),然後將所有文件一起部署並使用「java -jar your .jar「
如果你真的想擁有一個」jar-jar「解決方案,我們已經使用了一個jar幾年,但是離開了它,因爲我們的目標JVM在上述解決方案中運行得更好。
http://one-jar.sourceforge.net/
我在Eclipse的插件fatjar用它。我沒有任何關於將其構建到Netbeans中的經驗,但是構建成一個螞蟻腳本很簡單,我相信它是NEtbeans使用的。
您可以在build.xml文件中創建額外的構建目標。 並使用zipfileset
和zipgroupfileset
來創建一個大罐子 例如,
<target name="YourBigJar" depends="-post-jar">
<jar destfile="BigJar.jar">
<zipfileset src="dist/Project1.jar"/>
<zipfileset src="../OtherProject/dist/project2.jar"/>
<zipgroupfileset dir="../libs/."/>
</jar>
</target>
使用螞蟻+1可能是最好的方法 – stacker 2010-02-06 12:14:18
通知這將打破有簽名的罐子等 – 2010-02-06 16:33:31
我同意韋弗裏克。使用NetBeans完成此任務的最簡單方法是將自定義目標添加到您的build.xml中。 (順便說一下,由於使用NetBeans,您使用的是Ant,因爲NetBeans使用Ant來構建您的jar文件。)
Waverick的Ant目標似乎設計爲將來自不同NetBeans項目的編譯代碼合併到當前項目的jar文件。我的下面的目標完全符合你的要求。
<target name="-unjar-and-copy-lib-jars">
<unjar dest="${build.classes.dir}">
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<patternset>
<exclude name="META-INF/**"/>
<exclude name="/*"/>
</patternset>
</unjar>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar">
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<jar destfile="${dist.jar}">
<fileset dir="${build.classes.dir}"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
<echo>To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<echo>java -jar "${dist.jar.resolved}"</echo>
</target>
<target depends="clean,fat-jar" name="clean-and-fat-jar"/>
只要你將
有一個新的鏈接到您的博客發佈? – kevingreen 2012-04-12 13:15:13
沒關係,我發現它:[來自NetBeans的脂肪罐](http://joshuaborn.name/blog/cb49/) – kevingreen 2012-04-12 13:43:31
您可以用Java編程安裝使用Class.getResourceAsStream()
和FileOutputStream
外部庫。圖書館通常會進入Java\lib\ext\
。
以下是我走近它:
我放在副本中的所有JAR的我用成.res
子包。從那裏,我可以在任何地方複製它們。
private void installLibraries() {
new Thread() {
@Override
public void run() {
System.out.println("Checking for libraries");
File jre = new File(System.getProperty("java.home"));
File jar = new File(jre, "lib/ext/JAR_NAME.jar");
//Create more File objects that wrap your JAR's
try {
boolean added = false;
if (!jar.exists()) {
copyResource(jar, "JAR_NAME.jar");
added = true;
}
//Repeat for more JAR's
if (added) {
System.out.println("Libraries installed.");
} else {
System.out.println("Library check complete");
} catch (IOException ex) {
System.out.println("Library installation failed.");
ex.printStackTrace(System.out);
}
}
private void copyResource(File dest, String src) throws IOException {
System.out.println("Copying resource " + src + " to " + dest);
InputStream in = THIS_CLASS_NAME.class.getResourceAsStream("/YOUR_PACKAGE/res/" + src);
dest.getParentFile().mkdirs();
FileOutputStream out = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int i = 0;
while ((i = in.read(buffer)) > 0) {
out.write(buffer, 0, i);
}
out.close();
in.close();
}
}.start();
}
運行這個方法,你做任何事情之前,你完全可以無視外部JAR文件的Netbeans給你,只是分配一個。作爲補充說明,我使用這種方法來安裝javax.comm
,它不喜歡在外部分發。它帶有一個.dll文件和一個屬性文件。這些文件可以使用完全相同的方法安裝,但值得注意的是。dll文件必須放在Java\lib\
目錄中,而屬性文件放在Java\lib\
目錄中(不在\ext
文件夾中)。
我找到了一篇好文章here。但似乎值得一提的是它要求在dest/lib文件夾中的外部庫。你可以這樣做,但通常我們在根文件夾中有lib文件夾(或者我有)。如果它只是改變
<zipgroupfileset dir="dist/lib" includes="*.jar"/>
到
<zipgroupfileset dir="/lib" includes="*.jar"/>.
這就是全部。
試試這個博客... http://arunasujith.blogspot.com/2011/08/how-to-build-fat-jar-using-netbeans.html – 2013-03-22 09:39:26