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
2 changes: 1 addition & 1 deletion requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ dateparser~=0.7
python-dateutil~=2.6
pathlib2~=2.3.2; python_version<"3.4"
requests==2.20.1
aws_lambda_builders==0.1.0
aws_lambda_builders==0.2.0
serverlessrepo==0.1.5
10 changes: 9 additions & 1 deletion samcli/lib/build/workflow_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@
manifest_name="build.gradle",
executable_search_paths=None)

JAVA_MAVEN_CONFIG = CONFIG(
language="java",
dependency_manager="maven",
application_framework=None,
manifest_name="pom.xml",
executable_search_paths=None)


class UnsupportedRuntimeException(Exception):
pass
Expand Down Expand Up @@ -83,7 +90,8 @@ def get_workflow_config(runtime, code_dir, project_dir):
# manifest
"java8": ManifestWorkflowSelector([
# Gradle builder needs custom executable paths to find `gradlew` binary
JAVA_GRADLE_CONFIG._replace(executable_search_paths=[code_dir, project_dir])
JAVA_GRADLE_CONFIG._replace(executable_search_paths=[code_dir, project_dir]),
JAVA_MAVEN_CONFIG
]),
}

Expand Down
2 changes: 1 addition & 1 deletion samcli/local/common/runtime_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
"runtimes": ["java8"],
"dependency_manager": "maven",
"init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-java-maven"),
"build": False
"build": True
},
{
"runtimes": ["java8"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@
This is a sample template for {{ cookiecutter.project_name }} - Below is a brief explanation of what we have generated for you:

```bash
.
├── HelloWorldFunction
│   ├── pom.xml <-- Java dependencies
│   └── src
│   ├── main
│   │   └── java
│   │   └── helloworld <-- Source code for a lambda function
│   │   ├── App.java <-- Lambda function code
│   │   └── GatewayResponse.java <-- POJO for API Gateway Responses object
│   └── test <-- Unit tests
│   └── java
│   └── helloworld
│   └── AppTest.java
├── README.md <-- This instructions file
├── README.md <-- This instructions file
├── HelloWorldFunction <-- Source for HelloWorldFunction Lambda Function
│ ├── pom.xml <-- Java dependencies
│ └── src
│ ├── main
│ │ └── java
│ │ └── helloworld
│ │ ├── App.java <-- Lambda function code
│ │ └── GatewayResponse.java <-- POJO for API Gateway Responses object
│ └── test <-- Unit tests
│ └── java
│ └── helloworld
│ └── AppTest.java
└── template.yaml
```

Expand All @@ -31,11 +30,16 @@ This is a sample template for {{ cookiecutter.project_name }} - Below is a brief

### Installing dependencies

We use `maven` to install our dependencies and package our application into a JAR file:
```bash
sam build
```

You can also build on a Lambda like environment by using

```bash
mvn package
sam build --use-container
```

### Local development

**Invoking function locally through local API Gateway**
Expand Down Expand Up @@ -109,6 +113,7 @@ aws cloudformation describe-stacks \
We use `JUnit` for testing our code and you can simply run the following command to run our tests:

```bash
cd HelloWorldFunction
mvn test
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: target/HelloWorld-1.0.jar
CodeUri: HelloWorldFunction
Handler: helloworld.App::handleRequest
Runtime: java8
Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
Expand Down
20 changes: 12 additions & 8 deletions tests/integration/buildcmd/test_build_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,22 +240,26 @@ def _verify_built_artifact(self, build_dir, function_logical_id, expected_files,
self.assertTrue(any([True if self.EXPECTED_RUBY_GEM in gem else False for gem in os.listdir(str(gem_path))]))


class TestBuildCommand_JavaGradle(BuildIntegBase):
class TestBuildCommand_Java(BuildIntegBase):

EXPECTED_FILES_PROJECT_MANIFEST = {'aws', 'lib', "META-INF"}
EXPECTED_FILES_PROJECT_MANIFEST_GRADLE = {'aws', 'lib', "META-INF"}
EXPECTED_FILES_PROJECT_MANIFEST_MAVEN = {'aws', 'lib'}
EXPECTED_DEPENDENCIES = {'annotations-2.1.0.jar', "aws-lambda-java-core-1.1.0.jar"}

FUNCTION_LOGICAL_ID = "Function"
USING_GRADLE_PATH = os.path.join("Java", "gradle")
USING_GRADLEW_PATH = os.path.join("Java", "gradlew")
USING_MAVEN_PATH = str(Path('Java', 'maven'))

@parameterized.expand([
("java8", USING_GRADLE_PATH, False),
("java8", USING_GRADLEW_PATH, False),
("java8", USING_GRADLE_PATH, "use_container"),
("java8", USING_GRADLEW_PATH, "use_container"),
("java8", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE, False),
("java8", USING_GRADLEW_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE, False),
("java8", USING_MAVEN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_MAVEN, False),
("java8", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE, "use_container"),
("java8", USING_GRADLEW_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE, "use_container"),
("java8", USING_MAVEN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_MAVEN, "use_container")
])
def test_with_gradle(self, runtime, code_path, use_container):
def test_with_building_java(self, runtime, code_path, expected_files, use_container):
overrides = {"Runtime": runtime, "CodeUri": code_path, "Handler": "aws.example.Hello::myHandler"}
cmdlist = self.get_command_list(use_container=use_container,
parameter_overrides=overrides)
Expand All @@ -265,7 +269,7 @@ def test_with_gradle(self, runtime, code_path, use_container):
process.wait()

self._verify_built_artifact(self.default_build_dir, self.FUNCTION_LOGICAL_ID,
self.EXPECTED_FILES_PROJECT_MANIFEST, self.EXPECTED_DEPENDENCIES)
expected_files, self.EXPECTED_DEPENDENCIES)

self._verify_resource_property(str(self.built_template),
"OtherRelativePathResource",
Expand Down
26 changes: 26 additions & 0 deletions tests/integration/testdata/buildcmd/Java/maven/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>helloworld</groupId>
<artifactId>HelloWorld</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>A sample Hello World created for SAM CLI.</name>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>annotations</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package aws.example;


import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;

public class Hello {
public String myHandler(Context context) {
LambdaLogger logger = context.getLogger();
logger.log("Function Invoked\n");
return "Hello World";
}
}
16 changes: 10 additions & 6 deletions tests/unit/lib/build_module/test_workflow_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,24 @@ def test_must_work_for_ruby(self, runtime):
self.assertIsNone(result.executable_search_paths)

@parameterized.expand([
("java8", "build.gradle")
("java8", "build.gradle", "gradle"),
("java8", "pom.xml", "maven")
])
@patch("samcli.lib.build.workflow_config.os")
def test_must_work_for_java(self, runtime, build_file, os_mock):

def test_must_work_for_java(self, runtime, build_file, dep_manager, os_mock):
os_mock.path.join.side_effect = lambda dirname, v: v
os_mock.path.exists.side_effect = lambda v: v == build_file

result = get_workflow_config(runtime, self.code_dir, self.project_dir)
self.assertEquals(result.language, "java")
self.assertEquals(result.dependency_manager, "gradle")
self.assertEquals(result.dependency_manager, dep_manager)
self.assertEquals(result.application_framework, None)
self.assertEquals(result.manifest_name, "build.gradle")
self.assertEquals(result.executable_search_paths, [self.code_dir, self.project_dir])
self.assertEquals(result.manifest_name, build_file)

if dep_manager == "gradle":
self.assertEquals(result.executable_search_paths, [self.code_dir, self.project_dir])
else:
self.assertIsNone(result.executable_search_paths)

@parameterized.expand([
("java8", "unknown.manifest")
Expand Down