Java.eclipse - 如何导出Jar?

本文详细介绍了如何使用Eclipse导出包含main方法的普通类及依赖其他Jar包的类为Jar文件的过程。首先介绍不含外部依赖的简单类导出步骤,接着深入讲解包含第三方库的复杂情况。
第一:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包
1.在eclipse中选择你要导出的类或者package,右击,选择Export子选项; 

2.在弹出的对话框中,选择java文件---选择JAR file,单击next; 

3.在JAR file后面的文本框中选择你要生成的jar包的位置以及名字,注意在Export generated class files and resources和Export java source files and resources前面打上勾,单击next; 

4.单击两次next按钮,到达JAR Manifest Specification。注意在最底下的Main class后面的文本框中选择你的jar包的入口类。单击Finish,完成。 

你可以在dos环境下,进入你的jar所在的目录,运行 java -jar 名字.jar,检测运行是否正确。 

第二、你所要导出的类里边用到了别的jar包。比如说你写的类连接了数据库,用到数据库驱动包oracl.jar 

1.先把你要导出的类按照上面的步骤导出形成jar包,比如叫test.jar 

2.新建一个文件夹main,比如在D盘根目录下; 

3.把test.jar和oracl.jar拷贝到main文件下,右击test.jar,解压到当前文件夹。把META-INF\MANIFEST.MF剪切到另外一个地方 (比如是桌面!) ; 

4.右击oracl.jar,解压到当前文件夹。 

5.在dos环境下,进入到D盘的main文件夹下,执行 jar cvfm new.jar meta-inf/manifest.mf .,不要忘了最后面的点。 

6.用压缩工具打开你新生成的new.jar,用你放在桌面的META-INF\MANIFEST.MF覆盖new.jar原有。 

你可以在dos环境下,进入你的jar所在的目录,运行 java -jar 名字.jar,检测运行是否正确。 
!SESSION 2025-08-25 10:36:36.584 ----------------------------------------------- eclipse.buildId=unknown java.version=1.8.0_291 java.vendor=Oracle Corporation BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=zh_CN Framework arguments: -application test.rcp.application Command-line arguments: -application test.rcp.application -data D:\eclipse4/../runtime-test.rcp.application -dev file:D:/eclipse4/.metadata/.plugins/org.eclipse.pde.core/test.rcp.application/dev.properties -os win32 -ws win32 -arch x86_64 -consoleLog !ENTRY org.eclipse.osgi 4 0 2025-08-25 10:36:38.323 !MESSAGE Application error !STACK 1 java.lang.NoClassDefFoundError: org/cef/CefApp at test.rcp.Application.start(Application.java:17) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:595) at org.eclipse.equinox.launcher.Main.run(Main.java:1501) at org.eclipse.equinox.launcher.Main.main(Main.java:1474) Caused by: java.lang.ClassNotFoundException: org.cef.CefApp cannot be found by test.rcp_1.0.0.qualifier at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:511) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:414) at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:153) at java.lang.ClassLoader.loadClass(Unknown Source) ... 14 more An error has occurred. See the log file D:\runtime-test.rcp.application\.metadata\.log.
08-26
<think>我们正在处理一个Eclipse RCP应用程序启动时出现的`java.lang.NoClassDefFoundError: org/cef/CefApp`错误。这个错误表明在运行时找不到`org.cef.CefApp`类。根据引用[1]和引用[4]提供的线索,以及Eclipse RCP的特性,我们需要确保包含`CefApp`类的JCEF库被正确添加到RCP应用的插件依赖中,并且在构建路径和运行时类路径中可用。 ### 解决步骤: #### 1. **将JCEF库作为插件依赖添加到RCP项目** -Eclipse IDE中打开你的插件项目(通常是包含`MANIFEST.MF`和`plugin.xml`的项目)。 - 打开`MANIFEST.MF`文件,切换到**Dependencies**标签页。 - 在**Required Plug-ins**部分,点击**Add...**按钮,添加包含`org.cef.CefApp`类的插件。如果JCEF已经作为一个OSGi bundle存在,则直接添加它。如果没有,你可能需要先将JCEF库转换为一个插件(通过创建一个新的插件项目,并将JCEF的jar包和本地库放入其中)。 - 如果JCEF库不是以插件形式存在,你可以按照引用[1]的方法,将jar包添加到当前插件的类路径中: - 在`MANIFEST.MF`编辑器的**Runtime**标签页中,**Classpath**部分点击**Add...**按钮,添加你的jar包(例如`lib/jcef.jar`)。 - 这样,`MANIFEST.MF`文件中会生成`Bundle-ClassPath`条目,例如: ``` Bundle-ClassPath: lib/jcef.jar, . ``` - 同时,确保该jar包在项目的`build.properties`中被包含,以便在构建和导出时被包含。 #### 2. **确保本地库(natives)可用** - JCEF依赖于本地库(DLL/SO/DYLIB)。这些库需要被包含在插件中,并在运行时能被加载。 - 在插件项目中创建文件夹(例如`natives/win32/x86_64`)存放对应平台的本地库。 - 在`MANIFEST.MF`文件中,使用`Bundle-NativeCode`头指定本地库,例如: ``` Bundle-NativeCode: natives/win32/x86_64/jcef.dll; osname=win32; processor=x86_64 ``` 对于多平台支持,可以用逗号分隔多个路径,并指定相应的操作系统和处理器条件。 - 在`build.properties`中确保这些本地库被包含,例如: ``` bin.includes = META-INF/,\ .,\ lib/,\ natives/ ``` #### 3. **检查构建配置** - 打开`build.properties`文件,确保所有需要的资源(jar包、本地库)都被包含在`bin.includes`中。 - 如果使用了额外的库目录(如`lib`),确保该目录被包含。 #### 4. **更新产品配置文件(.product)** - 如果你的RCP应用使用`.product`文件定义,打开该文件。 - 在**Dependencies**标签页,点击**Add Required Plug-ins**按钮,确保包含JCEF的插件被添加进来。 - 如果之前有错误(如引用[4]中提到的缺少依赖),这一步可以解决依赖问题。 #### 5. **清理和重新构建** - 清理项目:选择项目,右键点击**Clean**,然后重新构建。 - 运行应用程序:如果是在开发环境中运行,确保通过Eclipse应用程序启动配置运行。 - 导出产品:如果问题出现在导出的产品中,重新导出产品并测试。 ### 代码示例:在RCP应用中初始化JCEF 在你的RCP应用启动类(`Application.java`)中,确保在使用`CefApp`之前,类加载器已经加载了该类。同时,注意JCEF的初始化必须在UI线程中完成,并且需要传入正确的参数。 ```java import org.cef.CefApp; import org.cef.CefSettings; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.IWorkbenchConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; public class Application implements IApplication { @Override public Object start(IApplicationContext context) { // 初始化CEF CefApp cefApp = null; try { // 设置CEF启动参数 String[] cefArgs = new String[] { "--disable-gpu" }; CefSettings settings = new CefSettings(); settings.windowless_rendering_enabled = false; // 初始化CEF cefApp = CefApp.getInstance(cefArgs, settings); } catch (Exception e) { e.printStackTrace(); return IApplication.EXIT_OK; } // 创建Display并启动工作台 Display display = PlatformUI.createDisplay(); try { int returnCode = PlatformUI.createAndRunWorkbench(display, new WorkbenchAdvisor() { @Override public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { return new WorkbenchWindowAdvisor(configurer); } @Override public String getInitialWindowPerspectiveId() { return "your.perspective.id"; } }); return returnCode; } finally { if (cefApp != null) { cefApp.dispose(); } display.dispose(); } } @Override public void stop() { // 应用停止逻辑 } } ``` ### 注意事项: - **类加载顺序**:确保在调用`CefApp.getInstance()`之前,JCEF的类已经被加载。在OSGi环境中,由于类加载器隔离,正确声明依赖是关键。 - **本地库路径**:如果本地库没有正确加载,会出现`UnsatisfiedLinkError`。确保`Bundle-NativeCode`设置正确,并且本地库在导出后的插件目录中。 - **多平台支持**:如果你的应用需要支持多个平台,需要在`Bundle-NativeCode`中为每个平台指定路径和条件,并在构建时包含所有平台的本地库。 ### 相关问题 1. 如何在Eclipse RCP中管理第三方非OSGi库的依赖? 2. 如何为JCEF配置跨平台(Windows/Linux/macOS)的本地库支持? 3.Eclipse RCP应用中,如何调试类加载问题? 4. 如何解决JCEF初始化时的`UnsatisfiedLinkError`错误? 5. 在RCP应用中使用JCEF时,如何正确关闭CEF以避免内存泄漏? 通过以上步骤,应该能够解决`NoClassDefFoundError: org/cef/CefApp`的问题。如果问题仍然存在,请检查Eclipse错误日志中的详细堆栈跟踪,以确定是否有其他依赖缺失。</think>### 解决 Eclipse RCP 应用启动时 `NoClassDefFoundError: org.cef.CefApp` 的完整方案 #### 1. **添加 JCEF 依赖到 OSGi 依赖体系** [^1] **核心问题**:Eclipse RCP 基于 OSGi 框架,所有依赖必须声明为插件(bundle): ```xml <!-- 在项目的 MANIFEST.MF 中添加 --> Require-Bundle: org.cef;bundle-version="1.0.11", org.eclipse.swt ``` **操作步骤**: 1. 打开 `MANIFEST.MF` → **Dependencies** 标签页 2. 在 **Required Plug-ins** 中添加 `org.cef` 3. 在 **Imported Packages** 添加: ```plaintext org.cef, org.cef.browser, org.cef.callback, org.cef.handler ``` #### 2. **配置本地库路径(关键步骤)** **跨平台配置**:在 `build.properties` 中声明本地库路径: ```properties # 包含所有平台的本地库 bin.includes = META-INF/,\ .,\ natives/,\ lib/win32-x86_64/,\ lib/linux-x86_64/,\ lib/macosx-arm64/ ``` **目录结构示例**: ``` your_project/ ├── lib/ │ ├── win32-x86_64/ │ │ ├── jcef.dll │ │ └── chrome_elf.dll │ ├── linux-x86_64/ │ │ ├── libcef.so │ │ └── chrome-sandbox │ └── macosx-arm64/ │ ├── jcef_app.app │ └── libcef.dylib ``` #### 3. **OSGi 本地库声明** 在 `MANIFEST.MF` 中添加跨平台本地库声明: ```plaintext Bundle-NativeCode: lib/win32-x86_64/jcef.dll; osname=win32; processor=x86_64, lib/linux-x86_64/libcef.so; osname=linux; processor=x86_64, lib/macosx-arm64/libcef.dylib; osname=macosx; processor=aarch64 ``` #### 4. **初始化顺序修正** 在 `Application.start()` 中初始化 CEF: ```java public class Application implements IApplication { @Override public Object start(IApplicationContext context) { // 先初始化CEF String[] cefArgs = {"--disable-gpu"}; if (!CefApp.startup(cefArgs)) { throw new RuntimeException("CEF初始化失败"); } // 再创建显示器和窗口 Display display = PlatformUI.createDisplay(); Shell shell = new Shell(display); // ...其他UI代码 } } ``` #### 5. **运行时验证** 添加类加载验证代码: ```java public static void checkCEFClass() { try { Class.forName("org.cef.CefApp"); System.out.println("✅ CefApp 类加载成功"); } catch (ClassNotFoundException e) { System.err.println("❌ CefApp 类未找到"); // 打印当前类路径 System.out.println("Classpath: " + System.getProperty("java.class.path").replace(":", "\n")); } } ``` #### 6. **导出配置** 在 `.product` 文件中(参考引用[4]): 1. 打开 **Configuration** 标签页 2. 勾选 **Include optional dependencies when computing required plug-ins** 3. 添加 `org.cef` 到 **Plug-ins and Fragments** 列表 #### 7. **常见错误排查表** | 错误现象 | 解决方案 | |----------|----------| | `UnsatisfiedLinkError` | 检查 `Bundle-NativeCode` 路径和平台标识符 | | `CefApp.getInstance() returns null` | 确保在 UI 线程调用 `CefApp.startup()` | | 导出后找不到类 | 在 `.product` 文件中添加 `org.cef` 插件 | | 浏览器窗口黑屏 | 添加 `--disable-gpu` 启动参数 | > **关键提示**:JCEF 的 OSGi bundle 必须包含完整的本地库结构。推荐使用预编译的 JCEF bundle[^1]。 --- ### 相关问题 1. 如何在 Eclipse RCP 中配置多平台本地库(Windows/Linux/macOS)? 2. 如何解决 JCEF 在 RCP 导出后的 `UnsatisfiedLinkError` 问题? 3. 在 OSGi 环境下如何管理 JCEF 的多个实例? 4. 如何为 JCEF 配置自定义命令行参数(如代理设置)? 5. 在 RCP 应用中如何实现 JCEF 与 JavaScript 的双向通信?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值