diff --git a/nx-dev/nx-dev/app/java/page.tsx b/nx-dev/nx-dev/app/java/page.tsx
new file mode 100644
index 0000000000..9d73fe038d
--- /dev/null
+++ b/nx-dev/nx-dev/app/java/page.tsx
@@ -0,0 +1,66 @@
+import { DefaultLayout } from '@nx/nx-dev/ui-common';
+import {
+ CallToAction,
+ Features,
+ FeatureSections,
+ GettingStarted,
+ Hero,
+ Resources,
+} from '@nx/nx-dev/ui-gradle';
+
+import type { Metadata } from 'next';
+
+export const metadata: Metadata = {
+ title: 'Nx For Java',
+ description:
+ 'Add Nx to your Java project for distributed task execution, intelligent caching, and affected commands.',
+ alternates: {
+ canonical: 'https://nx.dev/java',
+ },
+ openGraph: {
+ url: 'https://nx.dev/java',
+ title: 'Nx For Java',
+ description:
+ 'Add Nx to your Java project for distributed task execution, intelligent caching, and affected commands.',
+ images: [
+ {
+ url: 'https://nx.dev/socials/nx-gradle-media.png',
+ width: 800,
+ height: 421,
+ alt: 'Nx For Java',
+ type: 'image/jpeg',
+ },
+ ],
+ siteName: 'Nx',
+ type: 'website',
+ },
+};
+
+export default function JavaPage(): JSX.Element {
+ return (
+
+
+
+
+
+
+
+
+ {/*
*/}
+ {/* */}
+ {/*
*/}
+
+
+ {/* */}
+ {/* */}
+ {/*
*/}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/nx-dev/public/images/enterprise/nx-affected.avif b/nx-dev/nx-dev/public/images/enterprise/nx-affected.avif
new file mode 100644
index 0000000000..00a57f5dec
Binary files /dev/null and b/nx-dev/nx-dev/public/images/enterprise/nx-affected.avif differ
diff --git a/nx-dev/nx-dev/public/socials/nx-java-media.png b/nx-dev/nx-dev/public/socials/nx-java-media.png
new file mode 100644
index 0000000000..aa02270e0d
Binary files /dev/null and b/nx-dev/nx-dev/public/socials/nx-java-media.png differ
diff --git a/nx-dev/ui-gradle/.babelrc b/nx-dev/ui-gradle/.babelrc
new file mode 100644
index 0000000000..1ea870ead4
--- /dev/null
+++ b/nx-dev/ui-gradle/.babelrc
@@ -0,0 +1,12 @@
+{
+ "presets": [
+ [
+ "@nx/react/babel",
+ {
+ "runtime": "automatic",
+ "useBuiltIns": "usage"
+ }
+ ]
+ ],
+ "plugins": []
+}
diff --git a/nx-dev/ui-gradle/.eslintrc.json b/nx-dev/ui-gradle/.eslintrc.json
new file mode 100644
index 0000000000..a39ac5d057
--- /dev/null
+++ b/nx-dev/ui-gradle/.eslintrc.json
@@ -0,0 +1,18 @@
+{
+ "extends": ["plugin:@nx/react", "../../.eslintrc.json"],
+ "ignorePatterns": ["!**/*"],
+ "overrides": [
+ {
+ "files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.ts", "*.tsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.js", "*.jsx"],
+ "rules": {}
+ }
+ ]
+}
diff --git a/nx-dev/ui-gradle/README.md b/nx-dev/ui-gradle/README.md
new file mode 100644
index 0000000000..d457313776
--- /dev/null
+++ b/nx-dev/ui-gradle/README.md
@@ -0,0 +1,7 @@
+# nx-dev-ui-gradle
+
+This library was generated with [Nx](https://nx.dev).
+
+## Running unit tests
+
+Run `nx test nx-dev-ui-gradle` to execute the unit tests via [Jest](https://jestjs.io).
diff --git a/nx-dev/ui-gradle/jest.config.ts b/nx-dev/ui-gradle/jest.config.ts
new file mode 100644
index 0000000000..c7d1d4865d
--- /dev/null
+++ b/nx-dev/ui-gradle/jest.config.ts
@@ -0,0 +1,10 @@
+/* eslint-disable */
+export default {
+ displayName: 'nx-dev-ui-gradle',
+ preset: '../../jest.preset.js',
+ transform: {
+ '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nx/react/babel'] }],
+ },
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
+ coverageDirectory: '../../coverage/nx-dev/ui-gradle',
+};
diff --git a/nx-dev/ui-gradle/project.json b/nx-dev/ui-gradle/project.json
new file mode 100644
index 0000000000..384bc66f39
--- /dev/null
+++ b/nx-dev/ui-gradle/project.json
@@ -0,0 +1,8 @@
+{
+ "name": "nx-dev-ui-gradle",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "nx-dev/ui-gradle/src",
+ "projectType": "library",
+ "tags": [],
+ "targets": {}
+}
diff --git a/nx-dev/ui-gradle/src/index.ts b/nx-dev/ui-gradle/src/index.ts
new file mode 100644
index 0000000000..f41a696fd2
--- /dev/null
+++ b/nx-dev/ui-gradle/src/index.ts
@@ -0,0 +1 @@
+export * from './lib';
diff --git a/nx-dev/ui-gradle/src/lib/call-to-action.tsx b/nx-dev/ui-gradle/src/lib/call-to-action.tsx
new file mode 100644
index 0000000000..eb168780b5
--- /dev/null
+++ b/nx-dev/ui-gradle/src/lib/call-to-action.tsx
@@ -0,0 +1,130 @@
+import { ButtonLink, SectionHeading } from '@nx/nx-dev/ui-common';
+import { GradleIcon } from '@nx/nx-dev/ui-icons';
+import { cx } from '@nx/nx-dev/ui-primitives';
+import React, { ReactElement } from 'react';
+import Link from 'next/link';
+
+export function CallToAction(): ReactElement {
+ return (
+
+ {/* Background pattern */}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Gradient background */}
+
+
+ {/* Content */}
+
+
+
+
+
+
+ Get Started With Gradle
+
+
+ Check out the documentation for the @nx/gradle plugin to
+ learn more
+
+
+
+ Read the Docs{' '}
+
+ →
+
+
+
+ {/*
+ Read documentation{' '}
+
+ →
+
+ */}
+
+
+
+ Looking for Maven?
+
+
Maven support is coming soon.
+
+ Join the Nx Community Discord to be notified when it is released.{' '}
+
+
+
+ Join Us On Discord{' '}
+
+ →
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-gradle/src/lib/feature-sections.tsx b/nx-dev/ui-gradle/src/lib/feature-sections.tsx
new file mode 100644
index 0000000000..10de52f631
--- /dev/null
+++ b/nx-dev/ui-gradle/src/lib/feature-sections.tsx
@@ -0,0 +1,137 @@
+import { ReactElement } from 'react';
+import { ButtonLink, SectionHeading } from '@nx/nx-dev/ui-common';
+
+export function FeatureSections(): ReactElement {
+ return (
+
+
+
+ Supercharge your Java Projects{' '}
+
+ with Nx
+
+
+
+
+ {/* Affected Section */}
+
+
+ {/* Remote Caching Section */}
+
+
+ {/* Distribution Section */}
+
+
+ {/* Atomizer Section */}
+
+
+ {/* Flaky Test Retries Section */}
+
+
+
+
+ );
+}
+
+interface FeatureSectionProps {
+ title: string;
+ description: string;
+ imageSrc: string;
+ alt: string;
+ tag: string;
+ href: string;
+ reversed?: boolean;
+}
+
+function FeatureSection({
+ title,
+ description,
+ imageSrc,
+ alt,
+ tag,
+ href,
+}: FeatureSectionProps): ReactElement {
+ return (
+
+
+
+
+
+
+
+ {tag}
+
+
+ {title}
+
+
+ {description}
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-gradle/src/lib/features.tsx b/nx-dev/ui-gradle/src/lib/features.tsx
new file mode 100644
index 0000000000..c7fa66a976
--- /dev/null
+++ b/nx-dev/ui-gradle/src/lib/features.tsx
@@ -0,0 +1,277 @@
+import { SectionHeading } from '@nx/nx-dev/ui-common';
+import { cx } from '@nx/nx-dev/ui-primitives';
+import React, { ReactElement } from 'react';
+
+export function Features(): ReactElement {
+ return (
+ <>
+
+ Features
+
+
+
+ The Nx Plugin for Java integrates seamlessly with your existing Gradle
+ builds, adding powerful capabilities to your workflow.
+
+
+
+
+
+
+
+ }
+ />
+
+
+
+
+
+
+ }
+ />
+
+
+
+
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+ }
+ />
+
+
+
+
+
+
+ }
+ />
+
+
+
+
+
+ }
+ />
+
+ >
+ );
+}
+
+interface FeatureCardProps {
+ title: string;
+ description: string;
+ icon: JSX.Element;
+ href?: string;
+}
+
+function FeatureCard({
+ title,
+ description,
+ icon,
+ href = '#',
+}: FeatureCardProps): ReactElement {
+ return (
+
+
+
+
+ {icon}
+
+
{title}
+
{description}
+
+
+
+ );
+}
diff --git a/nx-dev/ui-gradle/src/lib/hero.tsx b/nx-dev/ui-gradle/src/lib/hero.tsx
new file mode 100644
index 0000000000..5f2eed0e40
--- /dev/null
+++ b/nx-dev/ui-gradle/src/lib/hero.tsx
@@ -0,0 +1,148 @@
+/* eslint-disable @nx/enforce-module-boundaries */
+import {
+ ButtonLink,
+ SectionHeading,
+ Strong,
+ SectionDescription,
+} from '@nx/nx-dev/ui-common';
+import { JavaIcon } from '@nx/nx-dev/ui-icons';
+/* eslint-enable @nx/enforce-module-boundaries */
+import { ReactElement } from 'react';
+
+export function Hero(): ReactElement {
+ return (
+
+
+ {/* Logo displayed above the title */}
+
+
+
+ Supercharge Your Java Projects
+
+
+ Get distributed tasks, intelligent caching, and target affected
+ packages to optimize your build process and CI pipeline. Support for{' '}
+ Gradle and Maven (coming soon)
+
+
+
+
+
+ );
+}
+
+export function GettingStarted(): ReactElement {
+ return (
+
+
+
+
+
+ Add Nx To An Existing Project
+
+
+ Currently Nx only supports Gradle. Support for Maven will come soon
+
+
+
+
+
+
+
+
+
+
+
+ {/* GitHub example project link */}
+
+
+
+ );
+}
+
+interface GetStartedCardProps {
+ title: string;
+ command: string;
+ description: string;
+}
+
+function GetStartedCard({
+ title,
+ command,
+ description,
+}: GetStartedCardProps): ReactElement {
+ return (
+
+
+ {title}
+
+
+ {command}
+
+
+
+ );
+}
diff --git a/nx-dev/ui-gradle/src/lib/index.ts b/nx-dev/ui-gradle/src/lib/index.ts
new file mode 100644
index 0000000000..718d1d40db
--- /dev/null
+++ b/nx-dev/ui-gradle/src/lib/index.ts
@@ -0,0 +1,5 @@
+export * from './hero';
+export * from './features';
+export * from './resources';
+export * from './call-to-action';
+export * from './feature-sections';
diff --git a/nx-dev/ui-gradle/src/lib/resources.tsx b/nx-dev/ui-gradle/src/lib/resources.tsx
new file mode 100644
index 0000000000..e8504ea77d
--- /dev/null
+++ b/nx-dev/ui-gradle/src/lib/resources.tsx
@@ -0,0 +1,71 @@
+import { ButtonLink, SectionHeading, TextLink } from '@nx/nx-dev/ui-common';
+import { cx } from '@nx/nx-dev/ui-primitives';
+import React, { ReactElement } from 'react';
+
+export function Resources(): ReactElement {
+ return (
+ <>
+
+ Resources
+
+
+ Learn more about using Nx with Java projects with these resources.
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+interface ResourceCardProps {
+ title: string;
+ description: string;
+ linkText: string;
+ href: string;
+}
+
+function ResourceCard({
+ title,
+ description,
+ linkText,
+ href,
+}: ResourceCardProps): ReactElement {
+ return (
+
+
+
{title}
+
{description}
+
+
+
+ {linkText}
+
+
+
+ );
+}
diff --git a/nx-dev/ui-gradle/tsconfig.json b/nx-dev/ui-gradle/tsconfig.json
new file mode 100644
index 0000000000..3c41f10fb2
--- /dev/null
+++ b/nx-dev/ui-gradle/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "allowJs": false,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.lib.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ }
+ ],
+ "extends": "../../tsconfig.base.json"
+}
diff --git a/nx-dev/ui-gradle/tsconfig.lib.json b/nx-dev/ui-gradle/tsconfig.lib.json
new file mode 100644
index 0000000000..11b228c24f
--- /dev/null
+++ b/nx-dev/ui-gradle/tsconfig.lib.json
@@ -0,0 +1,24 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "types": [
+ "node",
+ "@nx/react/typings/cssmodule.d.ts",
+ "@nx/react/typings/image.d.ts"
+ ],
+ "lib": ["DOM", "es2019"]
+ },
+ "exclude": [
+ "jest.config.ts",
+ "src/**/*.spec.ts",
+ "src/**/*.test.ts",
+ "src/**/*.spec.tsx",
+ "src/**/*.test.tsx",
+ "src/**/*.spec.js",
+ "src/**/*.test.js",
+ "src/**/*.spec.jsx",
+ "src/**/*.test.jsx"
+ ],
+ "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
+}
diff --git a/nx-dev/ui-gradle/tsconfig.spec.json b/nx-dev/ui-gradle/tsconfig.spec.json
new file mode 100644
index 0000000000..26ef046ac5
--- /dev/null
+++ b/nx-dev/ui-gradle/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "module": "commonjs",
+ "types": ["jest", "node"]
+ },
+ "include": [
+ "jest.config.ts",
+ "src/**/*.test.ts",
+ "src/**/*.spec.ts",
+ "src/**/*.test.tsx",
+ "src/**/*.spec.tsx",
+ "src/**/*.test.js",
+ "src/**/*.spec.js",
+ "src/**/*.test.jsx",
+ "src/**/*.spec.jsx",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 9d061d55fc..60b28521f4 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -107,6 +107,7 @@
"@nx/nx-dev/ui-customers": ["nx-dev/ui-customers/src/index.ts"],
"@nx/nx-dev/ui-enterprise": ["nx-dev/ui-enterprise/src/index.ts"],
"@nx/nx-dev/ui-fence": ["nx-dev/ui-fence/src/index.ts"],
+ "@nx/nx-dev/ui-gradle": ["nx-dev/ui-gradle/src/lib/index.ts"],
"@nx/nx-dev/ui-home": ["nx-dev/ui-home/src/index.ts"],
"@nx/nx-dev/ui-icons": ["nx-dev/ui-icons/src/index.ts"],
"@nx/nx-dev/ui-markdoc": ["nx-dev/ui-markdoc/src/index.ts"],