怎么在java项目添加jar包中调自定义的jar包中的类?

如何修改java工程中lib中的.jar包中的文件 -Java-技术中心-启天网
我的图书馆
如何修改java工程中lib中的.jar包中的文件 -Java-技术中心-启天网
今天在开发中,初次碰到要修改工程中lib中的.jar包中的文件,因.jar包的文件类型都是.class文件,要把其中的一个.class文件进行修改,首先碰到的问题有:1. 如何把.class文件进行反编译。2. .jar包中的文件如何替换。(一)针对上面的问题,我找来反编译工具进行反编译:反编译工具JD-GUI 下载地址为:(很不错!免费的哦)反编译后得到原java文件,对其进行修改。(二)替换.jar包中的文件先把.jar包进行解压,把刚才修改好的class文件覆盖掉以前的文件,然后再压缩为.zip文件(注意是.zip类型),完成后再修改为.jar类型。这样就大功告成了。重点的是再压缩为.zip类型,再修改为.jar类型。
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢java修改jar包文件内容的一个实例
开发这个小工具的初衷是为了修改工具 jar 包中的配置文件
本来打算将这个功能集成到 工具 jar 包自身
但是这里貌似有点儿问题,因为该 jar 包文件当前正在被 java 使用,所以无法对其进行修改操作~
这里我有点儿疑惑,难道不是将 jar 包整个加载到内存中去了么?
为什么磁盘上的物理文件还是被牢牢锁定?mac上是这样,windows里面也是这样,应该有点儿蹊跷,不深究了~
本示例主要包含了以下知识点:
1。遍历 jar 文件中的所有文件(jar包实际上就是zip压缩包,没什么神奇的)
2。就像读取磁盘中的其他文件一样,对jar执行 读入和写出操作
3。将 jar文件中的某个文件读到 swing的 jTextArea 里面,在退出的时候将修改过的文字覆盖回原文件
4。将InputStream 安全的转换为 byte[] 数组
5。拖拽取得文件的完整路径
下面直接上代码实例:
[java] package org.bruce.vertices.&
import java.awt.T&
import java.awt.datatransfer.DataF&
import java.awt.dnd.DnDC&
import java.awt.dnd.DropT&
import java.awt.dnd.DropTargetA&
import java.awt.dnd.DropTargetDropE&
import java.awt.event.WindowA&
import java.awt.event.WindowE&
import java.io.ByteArrayOutputS&
import java.io.F&
import java.io.FileOutputS&
import java.io.IOE&
import java.io.InputS&
import java.util.E&
import java.util.I&
import java.util.LinkedL&
import java.util.L&
import java.util.jar.JarE&
import java.util.jar.JarF&
import java.util.jar.JarOutputS&
import java.util.zip.ZipE&
import javax.swing.JF&
import javax.swing.JOptionP&
import javax.swing.JScrollB&
import javax.swing.JScrollP&
import javax.swing.JTextA&
&* @author Bruce Yang
&* PS:本示例专门用于编辑我自己制作的一个 jar 文件的属性文件,
&* 是不具备通用性的。不过既然放出,变得适应各种不同的需求,自然是不存在什么难题~
&* 为了方便地提供最基本的适应需求,主要将 configPath 修改为各自 jar包中 配置文件的 classPath 即可~
&* 一言以蔽之:
&* 这个工具主要起到了快捷修改jar文件中某个配置文件的作用~
&* 遗憾的是,还有一些需求我没能完成,诸如怎么将JTextArea中属性文件的内容修改的和elcipse中打开属性文件一样,
&* 那样的话,&=&,&true&,&false&,整数等值具备了不同高亮颜色的话,看起来就舒服多了~
&* 各位有兴趣可以试试,据我目前所知,JTextPane貌似更加适合做这个功能,但是有些小细节我不明了。。。
&* 如有对这个同样感兴趣且扩展出上述&高亮&功能的大侠,还请给我邮一份,不甚感激!
&* 在下邮箱:
public class JarCfgEditor extends JFrame {&
&&& private static final long serialVersionUID = -6731094L;&
&&& public String configPath = &org/bruce/vertices/resources/DefaultCfg.properties&;&
&&& public static final int CONSOLE_DIALOG_WIDTH = 500;&
&&& public static final int CONSOLE_DIALOG_HEIGHT = 400;&
&&& private JScrollP&
&&& private JTextA&
&&& private F&
&&& private void initMemberVariables() {&
&&&&&&& jta = new JTextArea();&
&&&&&&& jsp = new JScrollPane();&
&&& public JarCfgEditor() {&
&&&&&&& super();&
&&&&&&& this.initMemberVariables();&
&&&&&&& this.setSize(500, 400);&
&&&&&&& jsp.setViewportView(jta);&
&&&&&&& this.add(jsp);&
&&&&&&& JScrollBar jsb = jsp.getVerticalScrollBar();&
&&&&&&& jsb.setValue(jsb.getMaximum());&&
&&&&&&& int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().&
&&&&&&& int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().&
&&&&&&& this.setLocation((screenWidth-CONSOLE_DIALOG_WIDTH)/2,&&
&&&&&&&&&&&&&&& (screenHeight-CONSOLE_DIALOG_HEIGHT)/2);&
&&&&&&& /** 关闭的时候将修改过的属性覆盖到 jar 里面的属性配置文件~ */&
&&&&&&& this.addWindowListener(new WindowAdapter() {&
&&&&&&&&&&& public void windowClosing(WindowEvent arg0) {&
&&&&&&&&&&&&&&& if(original != null) {&
&&&&&&&&&&&&&&&&&&& write2JarFile();&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& System.exit(0);&
&&&&&&&&&&& }&
&&&&&&& });&
&&&&&&& new DropTarget(jta, DnDConstants.ACTION_COPY_OR_MOVE, new MyDropTargetListener(this));&
&&&&&&& this.setTitle(&CfgViewer0.1&);&
&&&&&&& this.setVisible(true);&
&&&& * 写入jar文件的话会将 jar文件原来的内容统统抹掉!!切记!!~
&&& private void write2JarFile() {&
&&&&&&& String originalPath = original.getAbsolutePath();&
&&&&&&& /** 创建一个临时文件来做暂存,待一切操作完毕之后会将该文件重命名为原文件的名称(原文件会被删除掉)~ */&
&&&&&&& String tempPath = originalPath.substring(0, originalPath.length()-4) + &_temp.jar&;&
&&&&&&& System.out.println(tempPath);&
&&&&&&& JarFile originalJar =&
&&&&&&& try {&
&&&&&&&&&&& originalJar = new JarFile(originalPath);&
&&&&&&& } catch (IOException e1) {&
&&&&&&&&&&& e1.printStackTrace();&
&&&&&&& }&
&&&&&&& List&JarEntry& lists = new LinkedList&JarEntry&();&
&&&&&&& for(Enumeration&JarEntry& entrys = originalJar.entries(); entrys.hasMoreElements();) {&
&&&&&&&&&&& JarEntry jarEntry = entrys.nextElement();&
//&&&&&&&&&&& System.out.println(jarEntry.getName());&&
&&&&&&&&&&& lists.add(jarEntry);&
&&&&&&& }&
&&&&&&& // 定义一个 jaroutputstream 流&&
&&&&&&& File handled = new File(tempPath);&
&&&&&&& JarOutputStream jos =&
&&&&&&& try {&
&&&&&&&&&&& FileOutputStream fos = new FileOutputStream(handled);&
&&&&&&&&&&& jos = new JarOutputStream(fos);&
&&&&&&&&&&&&&
&&&&&&&&&&& /**
&&&&&&&&&&&& * 将源文件中的内容复制过来~
&&&&&&&&&&&& * 可以利用循环将一个文件夹中的文件都写入jar包中 其实很简单
&&&&&&&&&&&& */&
&&&&&&&&&&& for(JarEntry je : lists) {&
&&&&&&&&&&&&&&& // jar 中的每一个文件夹 每一个文件 都是一个 jarEntry&&
&&&&&&&&&&&&&&& JarEntry newEntry = new JarEntry(je.getName());&
&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&& newEntry.setComment(je.getComment());&&
//&&&&&&&&&&&&& newEntry.setCompressedSize(je.getCompressedSize());&&
//&&&&&&&&&&&&& newEntry.setCrc(je.getCrc());&&
//&&&&&&&&&&&&& newEntry.setExtra(je.getExtra());&&
//&&&&&&&&&&&&& newEntry.setMethod(je.getMethod());&&
//&&&&&&&&&&&&& newEntry.setTime(je.getTime());&&
//&&&&&&&&&&&&& System.out.println(je.getAttributes());&&
&&&&&&&&&&&&&&& /** 这句代码有问题,会导致将jar包重命名为zip包之后无法解压缩~ */&
//&&&&&&&&&&&&& newEntry.setSize(je.getSize());&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& // 表示将该entry写入jar文件中 也就是创建该文件夹和文件&&
&&&&&&&&&&&&&&& jos.putNextEntry(newEntry);&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& /** 如果当前已经处理到属性文件了,那么将在 JTextArea 中编辑过的文本写入到该属性文件~ */&
&&&&&&&&&&&&&&& if(je.getName().equals(configPath)) {&
&&&&&&&&&&&&&&&&&&& jos.write(jta.getText().getBytes());&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& InputStream is = originalJar.getInputStream(je);&
&&&&&&&&&&&&&&& byte[] bytes = inputStream2byteArray(is);&
&&&&&&&&&&&&&&& is.close();&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& // 然后就是往entry中的jj.txt文件中写入内容&&
&&&&&&&&&&&&&&& jos.write(bytes);&
&&&&&&&&&&& }&
&&&&&&&&&&& // 最后不能忘记关闭流&&
&&&&&&&&&&& jos.close();&
&&&&&&&&&&& fos.close();&
&&&&&&&&&&&&&
&&&&&&&&&&& /** 删除原始文件,将新生成的文件重命名为原始文件的名称~ */&
&&&&&&&&&&& original.delete();&
&&&&&&&&&&& handled.renameTo(new File(originalPath));&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
&&&& * InputStream 转 byte[]~
&&&& * @param is
&&&& * @return
&&& public static byte[] inputStream2byteArray(InputStream is) {&
&&&&&&& ByteArrayOutputStream baos = new ByteArrayOutputStream();&
&&&&&&& try {&
&&&&&&&&&&& while((i = is.read()) != -1) {&
&&&&&&&&&&&&&&& baos.write(i);&
&&&&&&&&&&& }&
&&&&&&&&&&& baos.close();&
&&&&&&& } catch (IOException e) {&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
&&&&&&& byte[] bytes = baos.toByteArray();&
&&& /** getters && setters~ */&
&&& public JTextArea getJta() {&
&&& public void setJta(JTextArea jta) {&
&&&&&&& this.jta =&
&&& public File getJarFile() {&
&&& public void setJarFile(File jarFile) {&
&&&&&&& this.original = jarF&
&&&& * 主方法~
&&&& * @param args
&&& public static void main(String[] args) {&
&&&&&&& new JarCfgEditor();&
&* @author Bruce Yang
&* 拖拽监听~
class MyDropTargetListener extends DropTargetAdapter {&
&&& private JarCfgE&
&&& public MyDropTargetListener(JarCfgEditor jce) {&
&&&&&&& this.jce =&
&&& @Override&
&&& @SuppressWarnings(&unchecked&)&
&&& public void drop(DropTargetDropEvent event) {&
&&&&&&& if (event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {&
&&&&&&&&&&& event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);&
&&&&&&&&&&&&&
&&&&&&&&&&& DataFlavor df = DataFlavor.javaFileListF&
&&&&&&&&&&& List&File& list =&
&&&&&&&&&&& try {&
&&&&&&&&&&&&&&& list = (List&File&)(event.getTransferable().getTransferData(df));&
&&&&&&&&&&& } catch (Exception e) {&
&&&&&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&& }&
&&&&&&&&&&& Iterator&File& iterator = list.iterator();&
&&&&&&&&&&& while (iterator.hasNext()) {&
&&&&&&&&&&&&&&& File file = iterator.next();&
&&&&&&&&&&&&&&& if(file.exists() && file.isFile()) {&
&&&&&&&&&&&&&&&&&&& String filePath = file.getAbsolutePath();&
&&&&&&&&&&&&&&&&&&& if(filePath == null || filePath.equals(&&)) {&
&&&&&&&&&&&&&&&&&&&&&&& System.out.println(&文件名为 null 或为 \&\&~&);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& if(!filePath.contains(&GetVerticesMVC&) || !filePath.endsWith(&.jar&)) {&
&&&&&&&&&&&&&&&&&&&&&&& String str = &此工具专门为 GetVerticesMVC 设计,不通用!! 请注意!!&;&
&&&&&&&&&&&&&&&&&&&&&&& JOptionPane.showMessageDialog(null, str);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&& System.out.println(&jarFilePath=& + filePath);&
&&&&&&&&&&&&&&&&&&& jce.setJarFile(file);&
&&&&&&&&&&&&&&&&&&& JarFile jarFile =&
&&&&&&&&&&&&&&&&&&& try {&
&&&&&&&&&&&&&&&&&&&&&&& jarFile = new JarFile(filePath);&
&&&&&&&&&&&&&&&&&&&&&&& ZipEntry entry = jarFile.getEntry(jce.configPath);&
&&&&&&&&&&&&&&&&&&&&&&& if(entry == null) {&
&&&&&&&&&&&&&&&&&&&&&&&&&&& System.out.println(jce.configPath+&路径所代表的文件不存在!读取失败~&);&
&&&&&&&&&&&&&&&&&&&&&&&&&&& // 安全起见,将 jarFile 置为 null,这样在关闭窗口的时候将不会执行收尾操作~&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& jce.setJarFile(null);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&&&&&& //获取到inputstream了 就相当简单了&&
&&&&&&&&&&&&&&&&&&&&&&& InputStream is = jarFile.getInputStream(entry);&
&&&&&&&&&&&&&&&&&&&&&&& byte[] bytes = JarCfgEditor.inputStream2byteArray(is);&
&&&&&&&&&&&&&&&&&&&&&&& String cfgStr = new String(bytes);&
&&&&&&&&&&&&&&&&&&&&&&& jce.getJta().setText(cfgStr);&
&&&&&&&&&&&&&&&&&&& } catch (IOException e) {&
&&&&&&&&&&&&&&&&&&&&&&& e.printStackTrace();&
&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& // 一次只能处理一个,要避免处理多个的情况,因此 break 跳出~&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&&&&&& event.dropComplete(true);&
&&&&&&& } else {&
&&&&&&&&&&& event.rejectDrop();&
&&&&&&& }&
package org.bruce.vertices.
import java.awt.T
import java.awt.datatransfer.DataF
import java.awt.dnd.DnDC
import java.awt.dnd.DropT
import java.awt.dnd.DropTargetA
import java.awt.dnd.DropTargetDropE
import java.awt.event.WindowA
import java.awt.event.WindowE
import java.io.ByteArrayOutputS
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.util.E
import java.util.I
import java.util.LinkedL
import java.util.L
import java.util.jar.JarE
import java.util.jar.JarF
import java.util.jar.JarOutputS
import java.util.zip.ZipE
import javax.swing.JF
import javax.swing.JOptionP
import javax.swing.JScrollB
import javax.swing.JScrollP
import javax.swing.JTextA
&* @author Bruce Yang
&* PS:本示例专门用于编辑我自己制作的一个 jar 文件的属性文件,
&* 是不具备通用性的。不过源码既然放出,变得适应各种不同的需求,自然是不存在什么难题~
&* 为了方便地提供最基本的适应需求,主要将 configPath 修改为各自 jar包中 配置文件的 classPath 即可~
&* 一言以蔽之:
&* 这个工具主要起到了快捷修改jar文件中某个配置文件的作用~
&* 遗憾的是,还有一些需求我没能完成,诸如怎么将JTextArea中属性文件的内容修改的和elcipse中打开属性文件一样,
&* 那样的话,&=&,&true&,&false&,整数等值具备了不同高亮颜色的话,看起来就舒服多了~
&* 各位有兴趣可以试试,据我目前所知,JTextPane貌似更加适合做这个功能,但是有些小细节我不明了。。。
&* 如有对这个同样感兴趣且扩展出上述&高亮&功能的大侠,还请给我邮一份,不甚感激!
&* 在下邮箱:
public class JarCfgEditor extends JFrame {
&private static final long serialVersionUID = -6731094L;
&public String configPath = &org/bruce/vertices/resources/DefaultCfg.properties&;
&public static final int CONSOLE_DIALOG_WIDTH = 500;
&public static final int CONSOLE_DIALOG_HEIGHT = 400;
&private JScrollP
&private JTextA
&private F
&private void initMemberVariables() {
&&jta = new JTextArea();
&&jsp = new JScrollPane();
&public JarCfgEditor() {
&&super();
&&this.initMemberVariables();
&&this.setSize(500, 400);
&&jsp.setViewportView(jta);
&&this.add(jsp);
&&JScrollBar jsb = jsp.getVerticalScrollBar();
&&jsb.setValue(jsb.getMaximum());
&&int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().
&&int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().
&&this.setLocation((screenWidth-CONSOLE_DIALOG_WIDTH)/2,
&&&&(screenHeight-CONSOLE_DIALOG_HEIGHT)/2);
&&/** 关闭的时候将修改过的属性覆盖到 jar 里面的属性配置文件~ */
&&this.addWindowListener(new WindowAdapter() {
&&&public void windowClosing(WindowEvent arg0) {
&&&&if(original != null) {
&&&&&write2JarFile();
&&&&System.exit(0);
&&new DropTarget(jta, DnDConstants.ACTION_COPY_OR_MOVE, new MyDropTargetListener(this));
&&this.setTitle(&CfgViewer0.1&);
&&this.setVisible(true);
& * 写入jar文件的话会将 jar文件原来的内容统统抹掉!!切记!!~
&private void write2JarFile() {
&&String originalPath = original.getAbsolutePath();
&&/** 创建一个临时文件来做暂存,待一切操作完毕之后会将该文件重命名为原文件的名称(原文件会被删除掉)~ */
&&String tempPath = originalPath.substring(0, originalPath.length()-4) + &_temp.jar&;
&&System.out.println(tempPath);
&&JarFile originalJar =
&&&originalJar = new JarFile(originalPath);
&&} catch (IOException e1) {
&&&e1.printStackTrace();
&&List&JarEntry& lists = new LinkedList&JarEntry&();
&&&&&&& for(Enumeration&JarEntry& entrys = originalJar.entries(); entrys.hasMoreElements();) {
&&&&&&&&&&& JarEntry jarEntry = entrys.nextElement();
//&&&&&&&&&&& System.out.println(jarEntry.getName());
&&&&&&&&&&& lists.add(jarEntry);
&&// 定义一个 jaroutputstream 流
&&&&&&& File handled = new File(tempPath);
&&JarOutputStream jos =
&&&FileOutputStream fos = new FileOutputStream(handled);
&&&jos = new JarOutputStream(fos);
&&& * 将源文件中的内容复制过来~
&&& * 可以利用循环将一个文件夹中的文件都写入jar包中 其实很简单
&&&for(JarEntry je : lists) {
&&&&// jar 中的每一个文件夹 每一个文件 都是一个 jarEntry
&&&&JarEntry newEntry = new JarEntry(je.getName());
//&&&&newEntry.setComment(je.getComment());
//&&&&newEntry.setCompressedSize(je.getCompressedSize());
//&&&&newEntry.setCrc(je.getCrc());
//&&&&newEntry.setExtra(je.getExtra());
//&&&&newEntry.setMethod(je.getMethod());
//&&&&newEntry.setTime(je.getTime());
//&&&&System.out.println(je.getAttributes());
&&&&/** 这句代码有问题,会导致将jar包重命名为zip包之后无法解压缩~ */
//&&&&newEntry.setSize(je.getSize());
&&&&// 表示将该entry写入jar文件中 也就是创建该文件夹和文件
&&&&jos.putNextEntry(newEntry);
&&&&/** 如果当前已经处理到属性文件了,那么将在 JTextArea 中编辑过的文本写入到该属性文件~ */
&&&&if(je.getName().equals(configPath)) {
&&&&&jos.write(jta.getText().getBytes());
&&&&InputStream is = originalJar.getInputStream(je);
&&&&byte[] bytes = inputStream2byteArray(is);
&&&&is.close();
&&&&// 然后就是往entry中的jj.txt文件中写入内容
&&&&jos.write(bytes);
&&&// 最后不能忘记关闭流
&&&jos.close();
&&&fos.close();
&&&/** 删除原始文件,将新生成的文件重命名为原始文件的名称~ */
&&&original.delete();
&&&handled.renameTo(new File(originalPath));
&&} catch (Exception e) {
&&&e.printStackTrace();
& * InputStream 转 byte[]~
& * @param is
& * @return
&public static byte[] inputStream2byteArray(InputStream is) {
&&ByteArrayOutputStream baos = new ByteArrayOutputStream();
&&&while((i = is.read()) != -1) {
&&&&baos.write(i);
&&&baos.close();
&&} catch (IOException e) {
&&&e.printStackTrace();
&&byte[] bytes = baos.toByteArray();
&/** getters && setters~ */
&public JTextArea getJta() {
&public void setJta(JTextArea jta) {
&&this.jta =
&public File getJarFile() {
&public void setJarFile(File jarFile) {
&&this.original = jarF
& * 主方法~
& * @param args
&public static void main(String[] args) {
&&new JarCfgEditor();
&* @author Bruce Yang
&* 拖拽监听~
class MyDropTargetListener extends DropTargetAdapter {
&private JarCfgE
&public MyDropTargetListener(JarCfgEditor jce) {
&&this.jce =
&@Override
&@SuppressWarnings(&unchecked&)
&public void drop(DropTargetDropEvent event) {
&&if (event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
&&&event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
&&&DataFlavor df = DataFlavor.javaFileListF
&&&List&File& list =
&&&&list = (List&File&)(event.getTransferable().getTransferData(df));
&&&} catch (Exception e) {
&&&&e.printStackTrace();
&&&Iterator&File& iterator = list.iterator();
&&&while (iterator.hasNext()) {
&&&&File file = iterator.next();
&&&&if(file.exists() && file.isFile()) {
&&&&&String filePath = file.getAbsolutePath();
&&&&&if(filePath == null || filePath.equals(&&)) {
&&&&&&System.out.println(&文件名为 null 或为 \&\&~&);
&&&&&if(!filePath.contains(&GetVerticesMVC&) || !filePath.endsWith(&.jar&)) {
&&&&&&String str = &此工具专门为 GetVerticesMVC 设计,不通用!! 请注意!!&;
&&&&&&JOptionPane.showMessageDialog(null, str);
&&&&&System.out.println(&jarFilePath=& + filePath);
&&&&&jce.setJarFile(file);
&&&&&JarFile jarFile =
&&&&&try {
&&&&&&jarFile = new JarFile(filePath);
&&&&&&ZipEntry entry = jarFile.getEntry(jce.configPath);
&&&&&&if(entry == null) {
&&&&&&&System.out.println(jce.configPath+&路径所代表的文件不存在!读取失败~&);
&&&&&&&// 安全起见,将 jarFile 置为 null,这样在关闭窗口的时候将不会执行收尾操作~
&&&&&&&jce.setJarFile(null);
&&&&&&//获取到inputstream了 就相当简单了
&&&&&&InputStream is = jarFile.getInputStream(entry);
&&&&&&byte[] bytes = JarCfgEditor.inputStream2byteArray(is);
&&&&&&String cfgStr = new String(bytes);
&&&&&&jce.getJta().setText(cfgStr);
&&&&&} catch (IOException e) {
&&&&&&e.printStackTrace();
&&&&// 一次只能处理一个,要避免处理多个的情况,因此 break 跳出~
&&&event.dropComplete(true);
&&} else {
&&&event.rejectDrop();
摘自& yang3wei的专栏&Eclipse中Java项目打包——外部jar包位置&,生成jar包位置,mf文件书写等问题
一、manifest.mf文件
1. ***************
有外部jar包时,需要manifest.mf文件来指明,manifest.mf文件可以放在任何的位置。
***************
jar包生成后,manifest.mf文件可以删除。
====================================================================================
====================================================================================
二、生成的目标jar包与外部jar包的路径关系
,中讲到“假设我们的项目打包后为project.jar,那么按照上面的定义,应该在
project.jar的同层目录下建立一个lib文件夹,并将相关的jar包放在里面。否则将会出现Exception
in thread "main"
java.lang.NoClassDefFoundError的错误。”.
本质意义即:以project.jar所在文件夹的绝对路径+外部jar包相对project.jar的相对路径=外部jar包的绝对路径;
&外部jar包相对project.jar的相对路径:就是manifest.mf中罗列的jar包的class-path。
====================================================================================
====================================================================================
三、具体的情况分析(manifest.mf书写)
******待打包的项目****************
设有项目JWN,项目目录:需要的三个外部jar包在lib里。
具体的几种情况:
***************+*************************
若要将待打目标包放在当前项目的lib里,和外部jar包同层,那么manifest.mf的内容应为:
Manifest-Version: 1.0&
Class-Path: commons-logging.jar
junit-4.1.jar
Main-Class: src.YourMainClassNam
最后生成的包文件:
********************************************
&若要将目标包放在当前项目的lib外,在外部jar包外层,那么manifest.mf的内容应为:
Manifest-Version: 1.0&
Class-Path: lib\commons-logging.jar
lib\junit-4.1.jar
lib\jwnl.jar
Main-Class: src.YourMainClassNam
最后生成的包文件:
*************************************************
中生成的jar包是在项目外的,那么manifest.mf的内容应为:
Manifest-Version: 1.0
Class-Path: JWN\lib\commons-logging.jar
JWN\lib\junit-4.1.jar
JWN\lib\jwnl.jar
Main-Class: src.YourMainClassNam
******使用打好的项目包****************
=============================================================================
=============================================================================
测试jar包的项目jwnTest将生成的JWN.jar加载进来的目录如下:
1.因为加载进来的前3个jar包的位置是在JWN项目下lib中,第四个jar包位置也是在JWN项目中的,所以在运行的时候必须保证这4个jar包在原始位置仍然存在。
2.如果将jar包复制到别的地方,然后加载这个复制后位置上的jar包,,会出现错误:
Exception in thread "main"
java.lang.Error: Unresolved compilation problems:
=============================================================================
=============================================================================
====================================================================================
====================================================================================
将jar包打在测试项目里*****************
一般项目会习惯把涉及的jar包放在自己的项目里,所以上述3种情况,测试项目使用的外部jar包还是在项目外,会不方便,所以可以在打包时就将jar包指定为测试项目下面。例如,
测试项目jwntest,lib里是引用的JWN.jar包所需的3个外部jar包。
&*******************************************************
目标jar包在lib里的情况:manifest.mf的内容应为:
Manifest-Version: 1.0&
Class-Path: commons-logging.jar junit-4.1.jar jwnl.jar
Main-Class: src.YourMainClassName
**************************************************
目标jar包与lib同层情况:manifest.mf的内容应为:
Manifest-Version: 1.0&
Class-Path: lib\commons-logging.jar lib\junit-4.1.jar
lib\jwnl.jar
Main-Class: src.YourMainClassName
====================================================================================
====================================================================================
五、一定要注意最后要加载生成的jar包。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 java项目导入jar包 的文章

 

随机推荐