Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ on:
- master
schedule: [cron: "40 1 * * *"]

env:
JAVA_VERSION: "17"

jobs:
commitsar:
name: Verify commit messages
Expand Down Expand Up @@ -438,6 +441,35 @@ jobs:
set -e
yarn test

test-java:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, macos-13, windows-2022]

name: Java 17 on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4

- name: Build native library
# Build with `--release` as Gradle config expects `target/release`
run: cargo build --release
working-directory: bindings/java

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run tests
working-directory: bindings/java
run: gradle clean test

test-python:
strategy:
fail-fast: false
Expand Down
216 changes: 216 additions & 0 deletions .github/workflows/java-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
name: "[Java] Release"

on:
push:
tags:
- java-v*

defaults:
run:
shell: bash

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
JAVA_VERSION: "17"

jobs:
build-native-libraries:
strategy:
matrix:
include:
- os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
lib: libcss_inline.so
platform: linux-x86_64

- os: macos-13
target: x86_64-apple-darwin
lib: libcss_inline.dylib
platform: darwin-x86_64
- os: macos-14
target: aarch64-apple-darwin
lib: libcss_inline.dylib
platform: darwin-aarch64

- os: windows-2022
target: x86_64-pc-windows-msvc
lib: css_inline.dll
platform: win32-x86_64

name: Build native library for ${{ matrix.target }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}

- uses: Swatinem/rust-cache@v2
with:
workspaces: |
css-inline
bindings/java

- name: Build native library
working-directory: bindings/java
run: cargo build --release --target ${{ matrix.target }}

- name: Upload native library
uses: actions/upload-artifact@v4
with:
name: native-${{ matrix.platform }}
if-no-files-found: error
path: bindings/java/target/${{ matrix.target }}/release/${{ matrix.lib }}

build-jar:
name: Build JAR file
runs-on: ubuntu-22.04
needs: build-native-libraries
steps:
- uses: actions/checkout@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}

- name: Download all native libraries
uses: actions/download-artifact@v4
with:
path: native-libs

- name: Assemble JAR with native libraries
working-directory: bindings/java
run: |
mkdir -p src/main/resources/org/cssinline/native/{linux-x86_64,darwin-x86_64,darwin-aarch64,win32-x86_64}

# Copy native libraries to their expected location
cp ../../native-libs/native-linux-x86_64/libcss_inline.so src/main/resources/org/cssinline/native/linux-x86_64/
cp ../../native-libs/native-darwin-x86_64/libcss_inline.dylib src/main/resources/org/cssinline/native/darwin-x86_64/
cp ../../native-libs/native-darwin-aarch64/libcss_inline.dylib src/main/resources/org/cssinline/native/darwin-aarch64/
cp ../../native-libs/native-win32-x86_64/css_inline.dll src/main/resources/org/cssinline/native/win32-x86_64/

gradle build --info

- name: Upload JAR
uses: actions/upload-artifact@v4
with:
name: java-jar
if-no-files-found: error
path: bindings/java/build/libs/*.jar

test-jar:
needs: build-jar
strategy:
matrix:
include:
- os: ubuntu-22.04
platform: linux-x86_64
- os: macos-13
platform: darwin-x86_64
- os: macos-14
platform: darwin-aarch64
- os: windows-2022
platform: win32-x86_64

name: Test JAR on ${{ matrix.platform }}
runs-on: ${{ matrix.os }}
steps:
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}

- name: Download JAR
uses: actions/download-artifact@v4
with:
name: java-jar

- name: Integration test on ${{ matrix.platform }}
run: |
cat > Test.java << 'EOF'
import org.cssinline.CssInline;
public class Test {
public static void main(String[] args) {
String html = "<html><head><style>h1{color:red}</style></head><body><h1>Test</h1></body></html>";
String result = CssInline.inline(html);
if (!result.contains("style=\"color: red;\"")) {
throw new RuntimeException("Expected inlined style not found in: " + result);
}
System.out.println("✓ Integration test passed on ${{ matrix.platform }}");
}
}
EOF

JAR_FILE=$(ls *.jar)

if [[ "$RUNNER_OS" == "Windows" ]]; then
CLASSPATH_SEP=";"
else
CLASSPATH_SEP=":"
fi

javac -cp "$JAR_FILE" Test.java
java -cp "$JAR_FILE${CLASSPATH_SEP}." Test

publish-github-packages:
name: Publish to GitHub Packages
runs-on: ubuntu-22.04
needs: [build-jar, test-jar]
if: startsWith(github.ref, 'refs/tags/java-v')
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: ${{ env.JAVA_VERSION }}

- name: Download JAR artifact
uses: actions/download-artifact@v4
with:
name: java-jar
path: bindings/java/build/libs

- name: Extract version
run: echo "version=${GITHUB_REF#refs/tags/java-v}" >> $GITHUB_ENV

- name: Publish to GitHub Packages
working-directory: bindings/java
run: gradle publish -Pversion=${{ env.version }}
env:
GITHUB_ACTOR: ${{ github.actor }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

release:
name: Create GitHub Release
runs-on: ubuntu-22.04
needs: [build-jar, test-jar, publish-github-packages]
if: startsWith(github.ref, 'refs/tags/java-v')
steps:
- name: Download JAR
uses: actions/download-artifact@v4
with:
name: java-jar
path: dist

- name: Extract version
run: echo "version=${GITHUB_REF#refs/tags/java-v}" >> $GITHUB_ENV

- name: GitHub Release
uses: softprops/action-gh-release@v2
with:
make_latest: false
draft: true
name: "[Java] Release ${{ env.version }}"
files: dist/*.jar
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ into:
- Optionally caches external stylesheets
- Works on Linux, Windows, and macOS
- Supports HTML5 & CSS3
- Bindings for [Python](https://github.com/Stranger6667/css-inline/tree/master/bindings/python), [Ruby](https://github.com/Stranger6667/css-inline/tree/master/bindings/ruby), [JavaScript](https://github.com/Stranger6667/css-inline/tree/master/bindings/javascript), [C](https://github.com/Stranger6667/css-inline/tree/master/bindings/c), and a [WebAssembly](https://github.com/Stranger6667/css-inline/tree/master/bindings/javascript/wasm) module to run in browsers.
- Bindings for [Python](https://github.com/Stranger6667/css-inline/tree/master/bindings/python), [Ruby](https://github.com/Stranger6667/css-inline/tree/master/bindings/ruby), [JavaScript](https://github.com/Stranger6667/css-inline/tree/master/bindings/javascript), [Java](https://github.com/Stranger6667/css-inline/tree/master/bindings/java), [C](https://github.com/Stranger6667/css-inline/tree/master/bindings/c), and a [WebAssembly](https://github.com/Stranger6667/css-inline/tree/master/bindings/javascript/wasm) module to run in browsers.
- Command Line Interface

## Playground
Expand Down
2 changes: 2 additions & 0 deletions bindings/java/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.gradle/
build/
5 changes: 5 additions & 0 deletions bindings/java/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Changelog

## Unreleased

- Initial public release
18 changes: 18 additions & 0 deletions bindings/java/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[package]
name = "css_inline"
version = "0.15.0"
edition = "2024"
authors = ["Dmitry Dygalo <[email protected]>"]

[lib]
crate-type = ["cdylib"]
path = "src/main/rust/lib.rs"

[dependencies]
jni = "0.21.1"

[dependencies.css-inline]
path = "../../css-inline"
version = "*"
default-features = false
features = ["http", "file", "stylesheet-cache"]
Loading
Loading