diff --git a/CommunityToolkit.Aspire.sln b/CommunityToolkit.Aspire.sln index 17a621765..ef2cda004 100644 --- a/CommunityToolkit.Aspire.sln +++ b/CommunityToolkit.Aspire.sln @@ -3,25 +3,25 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.12.35101.237 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{899F0713-7FC6-4750-BAFC-AC650B35B453}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{414151D4-7009-4E78-A5C6-D99EBD1E67D1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java", "src\CommunityToolkit.Aspire.Hosting.Java\CommunityToolkit.Aspire.Hosting.Java.csproj", "{DAA67050-44B3-458F-9818-5877D606866A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.AppHost.Tests", "test\CommunityToolkit.Aspire.AppHost.Tests\CommunityToolkit.Aspire.AppHost.Tests.csproj", "{E2905A71-E25D-46FC-A128-D6A366D4D751}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{8519CC01-1370-47C8-AD94-B0F326B1563F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java.Tests", "test\CommunityToolkit.Aspire.Hosting.Java.Tests\CommunityToolkit.Aspire.Hosting.Java.Tests.csproj", "{2EA0F32C-F21B-4D29-8018-7E96363E4548}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "java", "java", "{F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{8519CC01-1370-47C8-AD94-B0F326B1563F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Java.WebApp", "examples\java\CommunityToolkit.Aspire.Java.WebApp\CommunityToolkit.Aspire.Java.WebApp.csproj", "{3D767C8C-7E04-4264-B4E9-13600650D2B1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Java.ApiApp", "examples\java\CommunityToolkit.Aspire.Java.ApiApp\CommunityToolkit.Aspire.Java.ApiApp.csproj", "{34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "java", "java", "{F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Java.AppHost", "examples\java\CommunityToolkit.Aspire.Java.AppHost\CommunityToolkit.Aspire.Java.AppHost.csproj", "{55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Java.ServiceDefaults", "examples\java\CommunityToolkit.Aspire.Java.ServiceDefaults\CommunityToolkit.Aspire.Java.ServiceDefaults.csproj", "{BBAFA814-1026-4A39-AA28-BCAE3951A224}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Java.WebApp", "examples\java\CommunityToolkit.Aspire.Java.WebApp\CommunityToolkit.Aspire.Java.WebApp.csproj", "{3D767C8C-7E04-4264-B4E9-13600650D2B1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{899F0713-7FC6-4750-BAFC-AC650B35B453}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.AppHost.Tests", "test\CommunityToolkit.Aspire.AppHost.Tests\CommunityToolkit.Aspire.AppHost.Tests.csproj", "{E2905A71-E25D-46FC-A128-D6A366D4D751}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -33,14 +33,10 @@ Global {DAA67050-44B3-458F-9818-5877D606866A}.Debug|Any CPU.Build.0 = Debug|Any CPU {DAA67050-44B3-458F-9818-5877D606866A}.Release|Any CPU.ActiveCfg = Release|Any CPU {DAA67050-44B3-458F-9818-5877D606866A}.Release|Any CPU.Build.0 = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.Build.0 = Release|Any CPU - {2EA0F32C-F21B-4D29-8018-7E96363E4548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2EA0F32C-F21B-4D29-8018-7E96363E4548}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2EA0F32C-F21B-4D29-8018-7E96363E4548}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2EA0F32C-F21B-4D29-8018-7E96363E4548}.Release|Any CPU.Build.0 = Release|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.Build.0 = Release|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|Any CPU.Build.0 = Debug|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -53,22 +49,22 @@ Global {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|Any CPU.Build.0 = Debug|Any CPU {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|Any CPU.ActiveCfg = Release|Any CPU {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|Any CPU.Build.0 = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.Build.0 = Release|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {E2905A71-E25D-46FC-A128-D6A366D4D751} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {2EA0F32C-F21B-4D29-8018-7E96363E4548} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} + {DAA67050-44B3-458F-9818-5877D606866A} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} = {8519CC01-1370-47C8-AD94-B0F326B1563F} + {3D767C8C-7E04-4264-B4E9-13600650D2B1} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} {BBAFA814-1026-4A39-AA28-BCAE3951A224} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} - {3D767C8C-7E04-4264-B4E9-13600650D2B1} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} + {E2905A71-E25D-46FC-A128-D6A366D4D751} = {899F0713-7FC6-4750-BAFC-AC650B35B453} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {08B1D4B8-D2C5-4A64-BB8B-E1A2B29525F0} diff --git a/agents/opentelemetry-javaagent.jar b/agents/opentelemetry-javaagent.jar new file mode 100644 index 000000000..357d5fecd Binary files /dev/null and b/agents/opentelemetry-javaagent.jar differ diff --git a/examples/java/CommunityToolkit.Aspire.Java.AppHost/CommunityToolkit.Aspire.Java.AppHost.csproj b/examples/java/CommunityToolkit.Aspire.Java.AppHost/CommunityToolkit.Aspire.Java.AppHost.csproj index b32f8447f..66d7b97ae 100644 --- a/examples/java/CommunityToolkit.Aspire.Java.AppHost/CommunityToolkit.Aspire.Java.AppHost.csproj +++ b/examples/java/CommunityToolkit.Aspire.Java.AppHost/CommunityToolkit.Aspire.Java.AppHost.csproj @@ -8,6 +8,8 @@ CommunityToolkit.Aspire.Java.AppHost CommunityToolkit.Aspire.Java.AppHost + + $(MSBuildProjectDirectory)/../CommunityToolkit.Aspire.Java.Spring.Maven @@ -20,4 +22,9 @@ + + + + + diff --git a/examples/java/CommunityToolkit.Aspire.Java.AppHost/Program.cs b/examples/java/CommunityToolkit.Aspire.Java.AppHost/Program.cs index 9b43869f0..274a86772 100644 --- a/examples/java/CommunityToolkit.Aspire.Java.AppHost/Program.cs +++ b/examples/java/CommunityToolkit.Aspire.Java.AppHost/Program.cs @@ -14,12 +14,12 @@ if (builder.ExecutionContext.IsPublishMode == false) { executableapp = builder.AddSpringApp("executableapp", - workingDirectory: "../CommunityToolkit.Aspire.Spring.Maven", + workingDirectory: "../CommunityToolkit.Aspire.Java.Spring.Maven", new JavaAppExecutableResourceOptions() { ApplicationName = "target/spring-maven-0.0.1-SNAPSHOT.jar", Port = 8085, - OtelAgentPath = "../../agents", + OtelAgentPath = "../../../agents", }); } diff --git a/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/App.razor b/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/App.razor index f006c88f6..b24a25d56 100644 --- a/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/App.razor +++ b/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/App.razor @@ -7,7 +7,7 @@ - + diff --git a/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/Layout/NavMenu.razor b/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/Layout/NavMenu.razor index ecc086189..dd12d56a6 100644 --- a/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/Layout/NavMenu.razor +++ b/examples/java/CommunityToolkit.Aspire.Java.WebApp/Components/Layout/NavMenu.razor @@ -1,6 +1,6 @@  diff --git a/global.json b/global.json new file mode 100644 index 000000000..a8ab760dd --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "allowPrerelease": false + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Java/README.md b/src/CommunityToolkit.Aspire.Hosting.Java/README.md index f22e10f95..f71bbc5e9 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Java/README.md +++ b/src/CommunityToolkit.Aspire.Hosting.Java/README.md @@ -1,26 +1,34 @@ -# Aspire Contribs +# CommunityToolkit.Aspire.Hosting.Java -This is a collection of community contributed libraries for .NET Aspire +This enables either containerised or executable Java app to be integrated with .NET Aspire. ## Prerequisites -- [JDK 17+](https://learn.microsoft.com/java/openjdk/download) -- [Springboot CLI](https://docs.spring.io/spring-boot/installing.html#getting-started.installing.cli) -- [Apache Maven](https://maven.apache.org) -- [Docker](https://docs.docker.com/get-docker/) +- [JDK 17+](https://learn.microsoft.com/java/openjdk/download) +- [Springboot CLI](https://docs.spring.io/spring-boot/installing.html#getting-started.installing.cli) +- [Apache Maven](https://maven.apache.org) +- [Docker](https://docs.docker.com/get-docker/) -## For Java App +## Quickstart -1. First of all, you should have [OpenTelemetry Agent for Java](https://opentelemetry.io/docs/zero-code/java/agent/). You can download it to your local machine by running the following commands: +1. Run .NET Aspire dashboard: ```bash - # Bash + dotnet watch run --project ./examples/java/CommunityToolkit.Aspire.Java.AppHost + ``` + +## More detailed steps (Optional) + +1. Download [OpenTelemetry Agent for Java](https://opentelemetry.io/docs/zero-code/java/agent/) to your local machine by running the following commands: + + ```bash + # bash/zsh mkdir -p ./agents wget -P ./agents \ https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar # PowerShell - New-item -type Directory -Path ./downloaded -Force + New-item -type Directory -Path ./agents -Force Invoke-WebRequest ` -OutFile "./agents/opentelemetry-javaagent.jar" ` -Uri "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar" @@ -29,7 +37,7 @@ This is a collection of community contributed libraries for .NET Aspire 1. Build the Spring app with Maven: ```bash - pushd ./src/CommunityToolkit.Aspire.Spring.Maven + pushd ./examples/java/CommunityToolkit.Aspire.Java.Spring.Maven ./mvnw clean package @@ -39,27 +47,23 @@ This is a collection of community contributed libraries for .NET Aspire 1. Build a container image for the Spring app: ```bash - pushd ./src/CommunityToolkit.Aspire.Spring.Maven + pushd ./examples/java/CommunityToolkit.Aspire.Java.Spring.Maven docker build . -t aspire-spring-maven-sample:latest popd ``` -1. Push the container image to [Docker Hub](https://hub.docker.com) under your organisation. This sample uses `aliencube`: +1. Push the container image to [Docker Hub](https://hub.docker.com) under your organisation, `contoso` for example: ```bash - docker tag aspire-spring-maven-sample:latest aliencube/aspire-spring-maven-sample:latest - docker push aliencube/aspire-spring-maven-sample:latest + docker tag aspire-spring-maven-sample:latest contoso/aspire-spring-maven-sample:latest + docker push contoso/aspire-spring-maven-sample:latest ``` > **NOTE**: You need to log in to Docker Hub before pushing the image. -1. Run .NET Aspire dashboard: - - ```bash - dotnet watch run --project ./src/CommunityToolkit.Aspire.AppHost - ``` +## Dashboard 1. Check the dashboard that both containerised app and executable app are up and running. @@ -71,6 +75,12 @@ This is a collection of community contributed libraries for .NET Aspire ## Deployment to Azure +1. Change the directory to `examples/java`. + + ```bash + cd ./examples/java + ``` + 1. Get the Azure environment name ready: ```bash diff --git a/test/CommunityToolkit.Aspire.Hosting.Java.Tests/CommunityToolkit.Aspire.Hosting.Java.Tests.csproj b/test/CommunityToolkit.Aspire.Hosting.Java.Tests/CommunityToolkit.Aspire.Hosting.Java.Tests.csproj deleted file mode 100644 index 86aec735f..000000000 --- a/test/CommunityToolkit.Aspire.Hosting.Java.Tests/CommunityToolkit.Aspire.Hosting.Java.Tests.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - true - - false - - true - - CommunityToolkit.Aspire.Hosting.Java.Tests - CommunityToolkit.Aspire.Hosting.Java.Tests - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/CommunityToolkit.Aspire.Hosting.Java.Tests/JavaAppHostingExtensionTests.cs b/test/CommunityToolkit.Aspire.Hosting.Java.Tests/JavaAppHostingExtensionTests.cs deleted file mode 100644 index 99a356b39..000000000 --- a/test/CommunityToolkit.Aspire.Hosting.Java.Tests/JavaAppHostingExtensionTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Net; - -using FluentAssertions; - -namespace CommunityToolkit.Aspire.Hosting.Java.Tests; - -public class JavaAppHostingExtensionTests -{ - [Fact] - public async Task Given_Container_Resource_When_Invoked_Then_Root_Returns_OK() - { - // Arrange - var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); - await using var app = await appHost.BuildAsync(); - await app.StartAsync(); - - Thread.Sleep(5000); - - // Act - var httpClient = app.CreateHttpClient("containerapp"); - var response = await httpClient.GetAsync("/"); - - // Assert - response.StatusCode.Should().Be(HttpStatusCode.OK); - } - - [Fact] - public async Task Given_Executable_Resource_When_Invoked_Then_Root_Returns_OK() - { - // Arrange - var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); - await using var app = await appHost.BuildAsync(); - await app.StartAsync(); - - Thread.Sleep(10000); - - // Act - var httpClient = app.CreateHttpClient("executableapp"); - var response = await httpClient.GetAsync("/"); - - // Assert - response.StatusCode.Should().Be(HttpStatusCode.OK); - } -} diff --git a/test/CommunityToolkit.Aspire.Hosting.Java.Tests/Program.cs b/test/CommunityToolkit.Aspire.Hosting.Java.Tests/Program.cs deleted file mode 100644 index 2a577b31e..000000000 --- a/test/CommunityToolkit.Aspire.Hosting.Java.Tests/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using CommunityToolkit.Aspire.Hosting.Java; - -var builder = DistributedApplication.CreateBuilder(args); - -builder.AddSpringApp("containerapp", - new JavaAppContainerResourceOptions() - { - ContainerImageName = "aspire-contribs/spring-maven-sample", - OtelAgentPath = "/agents" - }); - -builder.AddSpringApp("executableapp", - workingDirectory: "../../examples/java/CommunityToolkit.Aspire.Java.Spring.Maven", - new JavaAppExecutableResourceOptions() - { - ApplicationName = "target/spring-maven-0.0.1-SNAPSHOT.jar", - Port = 8085, - OtelAgentPath = "../../agents", - }); - -builder.Build().Run();