官方地址
https://bitbucket.org/chromiumembedded/java-cef
下載地址
https://bitbucket.org/chromiumembedded/java-cef/downloads/
https://github.com/chromiumembedded/java-cef
chromium各個平臺編譯好的版本下載地址
http://opensource.spotify.com/cefbuilds/index.html
文章發佈時chromium版本:CEF 3.3163.1663.g416ffeb / Chromium 61.0.3163.79
本文參考自官方文檔:https://bitbucket.org/chromiumembedded/java-cef/wiki/BranchesAndBuilding
編譯代碼
支持在Windows,Linux和Mac OS x下64位java下編譯,32位可能可以被編譯,但是未測試過。
需要安裝的軟件:
CMake >= 2.8.12.2版本
Git.
Java 1.7 或 1.8版本
Python >=2.6(2.x版本系列) (不支持3.x).
Windows平臺:
當前版本的JCEF使用Visual Studio 2015來編譯和運行,使用其它版本的開發工具可能會存在編譯或運行錯誤。
使用Git下載
# The JCEF source code will exist at `/path/to/java-cef/src`
cd /path/to/java-cef
git clone https://bitbucket.org/chromiumembedded/java-cef.git src
編譯指南
1. 編譯chromium(CEF)生成本地代碼(Windows下DLL,Linux下so):運行CMake生成特定平臺的本地代碼. 如果需要生成Release版本的jcef和jcef_helper,請設置CMaker的額外輸出參數。
Windows: 生成64位 VS2015項目工程.
# Enter the JCEF source code directory.
cd /path/to/java-cef/src
# Create and enter the `jcef_build` directory.
# The `jcef_build` directory name is required by other JCEF tooling
# and should not be changed.
mkdir jcef_build && cd jcef_build
# Windows: Generate 64-bit VS2015 project files.
cmake -G "Visual Studio 14 Win64" ..
# Open jcef.sln in Visual Studio
# - Select Build > Configuration Manager and change the "Active solution configuration" to "Release"
# - Select Build > Build Solution.
0> Failed to fetch file gs://chromium-clang-format/6ddedd571c56b8c184f30a3c1fc36984e8c10ccd for tools/buildtools/win/clang-format.exe, skipping. [Err: Traceback (most recent call last):
File "D:\project\java\java-cef\src\tools\buildtools\gsutil.py", line 9, in <module>
import argparse
ImportError: No module named argparse
有可能會因爲網絡原因出現上邊的下載錯誤,把gs://chromium-clang-format/6ddedd571c56b8c184f30a3c1fc36984e8c10ccd改爲https://storage.googleapis.com/chromium-clang-format/6ddedd571c56b8c184f30a3c1fc36984e8c10ccd,然後瀏覽器下載,下載完成後再把文件名改爲clang-format.exe放到tools目錄即可。
使用vs2015打開 jcef.sln
生成->配置管理器 ->活動解決方案配置,修改爲"Release"
生成->生成解決方案
2. 編譯JCEF的java代碼(java調用chromium代碼).
cd /path/to/java-cef/src/tools
compile.bat win64
3. 運行run.[bat|sh]命令測chromium,測試代碼中帶有兩個例子simple(java/simple/MainFrame.java)或detailed(java/detailed/MainFrame.java),可以在命令行中添加simple或detailed參數來運行不同的例子代碼
cd /path/to/java-cef/src/tools
run.bat win64 Release detailed
打包jar指南
把調用chromium的java代碼生成jar包。
cd /path/to/java-cef/src/tools
make_distrib.bat win64
新建eclipse項目
把上一邊生成的jar和dll相關文件放進項目中,也可以放進操作系統的庫目錄中。
我這裏的代碼目錄如下:
package tests.simple;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.Field;
import javax.swing.JFrame;
import javax.swing.JTextField;
import org.cef.CefApp;
import org.cef.CefApp.CefAppState;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.OS;
import org.cef.browser.CefBrowser;
import org.cef.handler.CefAppHandlerAdapter;
public class MainFrame extends JFrame {
private static final long serialVersionUID = -5570653778104813836L;
private final JTextField address_;
private final CefApp cefApp_;
private final CefClient client_;
private final CefBrowser browser_;
private final Component browerUI_;
private MainFrame(String startURL, boolean useOSR, boolean isTransparent) {
CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
@Override
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
// Shutdown the app if the native CEF part is terminated
if (state == CefAppState.TERMINATED) System.exit(0);
}
});
CefSettings settings = new CefSettings();
settings.windowless_rendering_enabled = useOSR;
cefApp_ = CefApp.getInstance(settings);
client_ = cefApp_.createClient();
browser_ = client_.createBrowser(startURL, useOSR, isTransparent);
browerUI_ = browser_.getUIComponent();
address_ = new JTextField(startURL, 100);
address_.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
browser_.loadURL(address_.getText());
}
});
getContentPane().add(address_, BorderLayout.NORTH);
getContentPane().add(browerUI_, BorderLayout.CENTER);
pack();
setSize(800, 600);
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
CefApp.getInstance().dispose();
dispose();
}
});
}
/**
* 添加DLL庫路徑
* @param libraryPath
*/
private static void addLibraryDir(String libraryPath){
try{
Field userPathsField = ClassLoader.class.getDeclaredField("usr_paths");
userPathsField.setAccessible(true);
String[] paths = (String[]) userPathsField.get(null);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < paths.length; i++) {
if (libraryPath.equals(paths[i])) {
continue;
}
sb.append(paths[i]).append(';');
}
sb.append(libraryPath);
System.setProperty("java.library.path", sb.toString());
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);
}
catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
//添加DLL庫
MainFrame.addLibraryDir("D:\\project\\java\\javacef\\lib\\win64");
new MainFrame("https://my.oschina.net/penngo/blog", OS.isLinux(), false);
}
}