diff --git a/modules/compute/build.gradle b/modules/compute/build.gradle
index 4e69e03..05b7257 100644
--- a/modules/compute/build.gradle
+++ b/modules/compute/build.gradle
@@ -19,6 +19,7 @@
 apply from: "$rootDir/buildscripts/publishing.gradle"
 apply from: "$rootDir/buildscripts/java-junit5.gradle"
 apply from: "$rootDir/buildscripts/java-integration-test.gradle"
+apply from: 'jobs.gradle'
 
 dependencies {
     implementation project(':ignite-api')
diff --git a/modules/compute/jobs.gradle b/modules/compute/jobs.gradle
new file mode 100644
index 0000000..13d392c
--- /dev/null
+++ b/modules/compute/jobs.gradle
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+sourceSets {
+    jobs
+    unit1
+    unit2
+}
+
+def registerJarTask(SourceSet sourceSet, String baseName) {
+    tasks.register(sourceSet.jarTaskName, Jar) {
+        group = 'build'
+        archiveBaseName = baseName
+        archiveVersion = '1.0-SNAPSHOT'
+        from sourceSet.output
+    }
+}
+
+registerJarTask(sourceSets.jobs, 'ignite-integration-test-jobs')
+registerJarTask(sourceSets.unit1, 'ignite-unit-test-job1')
+registerJarTask(sourceSets.unit2, 'ignite-unit-test-job2')
+
+processTestResources {
+    into('units/unit1') {
+        into('1.0.0') {
+            from unit1Jar
+        }
+        into('2.0.0') {
+            from unit2Jar
+        }
+        into('3.0.1') {
+            from unit1Jar
+            from unit2Jar
+        }
+        into('3.0.2') {
+            into('subdir') {
+                from unit2Jar
+            }
+            from unit1Jar
+        }
+    }
+    into('units/unit2') {
+        into('1.0.0') {
+            from unit1Jar
+        }
+        into('2.0.0') {
+            from unit2Jar
+        }
+    }
+
+    File corruptedJarFile = file("$destinationDir/units/unit1/4.0.0/unit1-1.0-corrupted.jar")
+    doLast {
+        // Generate a 100 bytes long file with random contents to simulate corrupted jar
+        byte[] randomBytes = new byte[100]
+        new Random().nextBytes(randomBytes)
+        corruptedJarFile.parentFile.mkdirs()
+        corruptedJarFile.bytes = randomBytes
+    }
+}
+
+processIntegrationTestResources {
+    into('units') {
+        from jobsJar
+        from unit1Jar
+        from unit2Jar
+    }
+}
+
+dependencies {
+    jobsImplementation project(':ignite-api')
+    unit1Implementation project(':ignite-api')
+    unit2Implementation project(':ignite-api')
+
+    integrationTestImplementation sourceSets.jobs.output
+}
diff --git a/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeBaseTest.java b/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeBaseTest.java
index 6e1c3bb..543d935 100644
--- a/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeBaseTest.java
+++ b/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeBaseTest.java
@@ -56,16 +56,24 @@
 import org.junit.jupiter.api.Test;
 
 /**
- * Base integration tests for Compute functionality.
+ * Base integration tests for Compute functionality. To add new compute job for testing both in embedded and standalone mode, add the
+ * corresponding job class to the jobs source set. The integration tests depend on this source set so the job class will be visible and it
+ * will be automatically compiled and packed into the ignite-integration-test-jobs-1.0-SNAPSHOT.jar.
  */
 public abstract class ItComputeBaseTest extends ClusterPerClassIntegrationTest {
     protected abstract List<DeploymentUnit> units();
 
-    protected abstract String concatJobClassName();
+    static String concatJobClassName() {
+        return ConcatJob.class.getName();
+    }
 
-    protected abstract String getNodeNameJobClassName();
+    private static String getNodeNameJobClassName() {
+        return GetNodeNameJob.class.getName();
+    }
 
-    protected abstract String failingJobClassName();
+    private static String failingJobClassName() {
+        return FailingJob.class.getName();
+    }
 
     @Test
     void executesJobLocally() {
diff --git a/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestEmbedded.java b/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestEmbedded.java
index 592fe7c..294b6fe 100644
--- a/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestEmbedded.java
+++ b/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestEmbedded.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.compute;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.stream.Collectors.joining;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.IgniteExceptionTestUtils.assertPublicCheckedException;
@@ -40,7 +39,6 @@
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -85,21 +83,6 @@
         return List.of();
     }
 
-    @Override
-    protected String concatJobClassName() {
-        return ConcatJob.class.getName();
-    }
-
-    @Override
-    protected String getNodeNameJobClassName() {
-        return GetNodeNameJob.class.getName();
-    }
-
-    @Override
-    protected String failingJobClassName() {
-        return FailingJob.class.getName();
-    }
-
     @ParameterizedTest
     @MethodSource("wrongJobClassArguments")
     void executesWrongJobClassLocally(String jobClassName, int errorCode, String msg) {
@@ -395,23 +378,6 @@
         return IntStream.range(0, initialNodes()).mapToObj(Arguments::of);
     }
 
-    private static class ConcatJob implements ComputeJob<String> {
-        /** {@inheritDoc} */
-        @Override
-        public String execute(JobExecutionContext context, Object... args) {
-            return Arrays.stream(args)
-                    .map(Object::toString)
-                    .collect(joining());
-        }
-    }
-
-    private static class GetNodeNameJob implements ComputeJob<String> {
-        /** {@inheritDoc} */
-        @Override
-        public String execute(JobExecutionContext context, Object... args) {
-            return context.ignite().name();
-        }
-    }
 
     private static class CustomFailingJob implements ComputeJob<String> {
         /** {@inheritDoc} */
@@ -421,19 +387,7 @@
         }
     }
 
-    private static class FailingJob implements ComputeJob<String> {
-        /** {@inheritDoc} */
-        @Override
-        public String execute(JobExecutionContext context, Object... args) {
-            throw new JobException("Oops", new Exception());
-        }
-    }
 
-    private static class JobException extends RuntimeException {
-        private JobException(String message, Throwable cause) {
-            super(message, cause);
-        }
-    }
 
     private static List<Arguments> wrongJobClassArguments() {
         return List.of(
diff --git a/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestStandalone.java b/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestStandalone.java
index 250cbb0..82be3db 100644
--- a/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestStandalone.java
+++ b/modules/compute/src/integrationTest/java/org/apache/ignite/internal/compute/ItComputeTestStandalone.java
@@ -64,7 +64,7 @@
                 () -> entryNode.deployment().clusterStatusAsync(unit.name(), unit.version()),
                 willBe(nullValue())
         );
-        deployJar(entryNode, unit.name(), unit.version(), "ignite-it-jobs-1.0-SNAPSHOT.jar");
+        deployJar(entryNode, unit.name(), unit.version(), "ignite-integration-test-jobs-1.0-SNAPSHOT.jar");
     }
 
     @Override
@@ -72,21 +72,6 @@
         return units;
     }
 
-    @Override
-    protected String concatJobClassName() {
-        return "org.example.ConcatJob";
-    }
-
-    @Override
-    protected String getNodeNameJobClassName() {
-        return "org.example.GetNodeNameJob";
-    }
-
-    @Override
-    protected String failingJobClassName() {
-        return "org.example.FailingJob";
-    }
-
     @Test
     @Disabled("https://issues.apache.org/jira/browse/IGNITE-19623")
     @Override
@@ -121,7 +106,7 @@
         assertComputeException(
                 ex0,
                 ClassNotFoundException.class,
-                "org.example.ConcatJob. Deployment unit non-existing:1.0.0 doesn't exist"
+                "org.apache.ignite.internal.compute.ConcatJob. Deployment unit non-existing:1.0.0 doesn't exist"
         );
     }
 
@@ -132,17 +117,17 @@
         IgniteImpl entryNode = node(0);
 
         DeploymentUnit firstVersion = new DeploymentUnit("latest-unit", Version.parseVersion("1.0.0"));
-        deployJar(entryNode, firstVersion.name(), firstVersion.version(), "ignite-ut-job1-1.0-SNAPSHOT.jar");
+        deployJar(entryNode, firstVersion.name(), firstVersion.version(), "ignite-unit-test-job1-1.0-SNAPSHOT.jar");
 
         CompletableFuture<Integer> result1 = entryNode.compute()
-                .executeAsync(Set.of(entryNode.node()), jobUnits, "org.my.job.compute.unit.UnitJob");
+                .executeAsync(Set.of(entryNode.node()), jobUnits, "org.apache.ignite.internal.compute.UnitJob");
         assertThat(result1, willBe(1));
 
         DeploymentUnit secondVersion = new DeploymentUnit("latest-unit", Version.parseVersion("1.0.1"));
-        deployJar(entryNode, secondVersion.name(), secondVersion.version(), "ignite-ut-job2-1.0-SNAPSHOT.jar");
+        deployJar(entryNode, secondVersion.name(), secondVersion.version(), "ignite-unit-test-job2-1.0-SNAPSHOT.jar");
 
         CompletableFuture<String> result2 = entryNode.compute()
-                .executeAsync(Set.of(entryNode.node()), jobUnits, "org.my.job.compute.unit.UnitJob");
+                .executeAsync(Set.of(entryNode.node()), jobUnits, "org.apache.ignite.internal.compute.UnitJob");
         assertThat(result2, willBe("Hello World!"));
     }
 
@@ -150,7 +135,7 @@
     void undeployAcquiredUnit() {
         IgniteImpl entryNode = node(0);
         CompletableFuture<Void> job = entryNode.compute()
-                .executeAsync(Set.of(entryNode.node()), units, "org.example.SleepJob", 3L);
+                .executeAsync(Set.of(entryNode.node()), units, SleepJob.class.getName(), 3L);
 
         assertThat(entryNode.deployment().undeployAsync(unit.name(), unit.version()), willCompleteSuccessfully());
 
@@ -172,12 +157,12 @@
     void executeJobWithObsoleteUnit() {
         IgniteImpl entryNode = node(0);
         CompletableFuture<Void> successJob = entryNode.compute()
-                .executeAsync(Set.of(entryNode.node()), units, "org.example.SleepJob", 2L);
+                .executeAsync(Set.of(entryNode.node()), units, SleepJob.class.getName(), 2L);
 
         assertThat(entryNode.deployment().undeployAsync(unit.name(), unit.version()), willCompleteSuccessfully());
 
         CompletableFuture<Void> failedJob = entryNode.compute()
-                .executeAsync(Set.of(entryNode.node()), units, "org.example.SleepJob", 2L);
+                .executeAsync(Set.of(entryNode.node()), units, SleepJob.class.getName(), 2L);
 
         CompletionException ex0 = assertThrows(CompletionException.class, failedJob::join);
         assertComputeException(
diff --git a/modules/compute/src/integrationTest/resources/units/ignite-it-jobs-1.0-SNAPSHOT.jar b/modules/compute/src/integrationTest/resources/units/ignite-it-jobs-1.0-SNAPSHOT.jar
deleted file mode 100644
index 7700570..0000000
--- a/modules/compute/src/integrationTest/resources/units/ignite-it-jobs-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/integrationTest/resources/units/ignite-jobs-1.0-SNAPSHOT-src.zip b/modules/compute/src/integrationTest/resources/units/ignite-jobs-1.0-SNAPSHOT-src.zip
deleted file mode 100644
index a9fe96f..0000000
--- a/modules/compute/src/integrationTest/resources/units/ignite-jobs-1.0-SNAPSHOT-src.zip
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/integrationTest/resources/units/ignite-ut-job1-1.0-SNAPSHOT.jar b/modules/compute/src/integrationTest/resources/units/ignite-ut-job1-1.0-SNAPSHOT.jar
deleted file mode 100644
index 1c33f9c..0000000
--- a/modules/compute/src/integrationTest/resources/units/ignite-ut-job1-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/integrationTest/resources/units/ignite-ut-job2-1.0-SNAPSHOT.jar b/modules/compute/src/integrationTest/resources/units/ignite-ut-job2-1.0-SNAPSHOT.jar
deleted file mode 100644
index e4d23cf..0000000
--- a/modules/compute/src/integrationTest/resources/units/ignite-ut-job2-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/ConcatJob.java b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/ConcatJob.java
new file mode 100644
index 0000000..81decb7
--- /dev/null
+++ b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/ConcatJob.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.JobExecutionContext;
+
+/** Compute job that concatenates the string representation of its arguments. */
+public class ConcatJob implements ComputeJob<String> {
+    @Override
+    public String execute(JobExecutionContext context, Object... args) {
+        return Arrays.stream(args)
+                .map(Object::toString)
+                .collect(Collectors.joining());
+    }
+}
diff --git a/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/FailingJob.java b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/FailingJob.java
new file mode 100644
index 0000000..4286c56
--- /dev/null
+++ b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/FailingJob.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.JobExecutionContext;
+
+/** Compute job that always fails with the {@link JobException}. */
+public class FailingJob implements ComputeJob<String> {
+    @Override
+    public String execute(JobExecutionContext context, Object... args) {
+        throw new JobException("Oops", new Exception());
+    }
+}
diff --git a/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/GetNodeNameJob.java b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/GetNodeNameJob.java
new file mode 100644
index 0000000..558077a
--- /dev/null
+++ b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/GetNodeNameJob.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.JobExecutionContext;
+
+/** Compute job that returns the node name. */
+public class GetNodeNameJob implements ComputeJob<String> {
+    @Override
+    public String execute(JobExecutionContext context, Object... args) {
+        return context.ignite().name();
+    }
+}
diff --git a/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/JobException.java b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/JobException.java
new file mode 100644
index 0000000..e608edf
--- /dev/null
+++ b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/JobException.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+class JobException extends RuntimeException {
+    JobException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/SleepJob.java b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/SleepJob.java
new file mode 100644
index 0000000..0dd3209
--- /dev/null
+++ b/modules/compute/src/jobs/java/org/apache/ignite/internal/compute/SleepJob.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+import java.util.concurrent.TimeUnit;
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.JobExecutionContext;
+
+/** Compute job that sleeps for a number of milliseconds passed in the argument. */
+public class SleepJob implements ComputeJob<Void> {
+    @Override
+    public Void execute(JobExecutionContext jobExecutionContext, Object... args) {
+        try {
+            TimeUnit.SECONDS.sleep((Long) args[0]);
+            return null;
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/modules/compute/src/test/README.md b/modules/compute/src/test/README.md
deleted file mode 100644
index 56eda0d..0000000
--- a/modules/compute/src/test/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# ignite-compute
-
-## Unit tests
-[ignite-jobs-1.0-SNAPSHOT-src.zip](resources%2Funits%2Fignite-jobs-1.0-SNAPSHOT-src.zip) contains a zip archive with a 
-test project which was used to create jars for `org.apache.ignite.internal.compute.loader.JobClassLoaderFactoryTest` tests.
-
-[ignite-ut-job1-1.0-SNAPSHOT.jar](resources%2Funits%2Funit1%2F1.0.0%2Fignite-ut-job1-1.0-SNAPSHOT.jar) contains two classes 
-which are used in tests:
-* `org.apache.ignite.internal.compute.unit1.Unit1` - `extends org.apache.ignite.compute.ComputeJob` and returns 1 as Integer.
-* `org.my.job.compute.unit.Job1Utility`
-
-[ignite-ut-job2-1.0-SNAPSHOT.jar](resources%2Funits%2Funit1%2F2.0.0%2Fignite-ut-job2-1.0-SNAPSHOT.jar) contains two classes
-which are used in tests:
-* `org.apache.ignite.internal.compute.unit1.Unit2` - extends `org.apache.ignite.compute.ComputeJob` and returns "Hello World!" as String.
-* `org.my.job.compute.unit.Job2Utility`
diff --git a/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobClassLoaderFactoryTest.java b/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobClassLoaderFactoryTest.java
index 37eb84b..4887d27 100644
--- a/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobClassLoaderFactoryTest.java
+++ b/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobClassLoaderFactoryTest.java
@@ -41,6 +41,12 @@
 
 @ExtendWith(MockitoExtension.class)
 class JobClassLoaderFactoryTest extends BaseIgniteAbstractTest {
+    private static final String UNIT_JOB_CLASS_NAME = "org.apache.ignite.internal.compute.UnitJob";
+
+    private static final String JOB1_UTILITY_CLASS_NAME = "org.apache.ignite.internal.compute.Job1Utility";
+
+    private static final String JOB2_UTILITY_CLASS_NAME = "org.apache.ignite.internal.compute.Job2Utility";
+
     private final Path unitsDir = getPath(JobClassLoaderFactory.class.getClassLoader().getResource("units"));
 
     private final JobClassLoaderFactory jobClassLoaderFactory = new JobClassLoaderFactory();
@@ -56,13 +62,13 @@
         try (JobClassLoader classLoader1 = jobClassLoaderFactory.createClassLoader(units1);
                 JobClassLoader classLoader2 = jobClassLoaderFactory.createClassLoader(units2)) {
             // then classes from the first unit are loaded from the first class loader
-            Class<?> clazz1 = classLoader1.loadClass("org.my.job.compute.unit.UnitJob");
+            Class<?> clazz1 = classLoader1.loadClass(UNIT_JOB_CLASS_NAME);
             ComputeJob<Integer> job1 = (ComputeJob<Integer>) clazz1.getDeclaredConstructor().newInstance();
             Integer result1 = job1.execute(null);
             assertEquals(1, result1);
 
             // and classes from the second unit are loaded from the second class loader
-            Class<?> clazz2 = classLoader2.loadClass("org.my.job.compute.unit.UnitJob");
+            Class<?> clazz2 = classLoader2.loadClass(UNIT_JOB_CLASS_NAME);
             ComputeJob<String> job2 = (ComputeJob<String>) clazz2.getDeclaredConstructor().newInstance();
             String result2 = job2.execute(null);
             assertEquals("Hello World!", result2);
@@ -79,7 +85,7 @@
         );
 
         try (JobClassLoader classLoader = jobClassLoaderFactory.createClassLoader(units)) {
-            Class<?> unitJobClass = classLoader.loadClass("org.my.job.compute.unit.UnitJob");
+            Class<?> unitJobClass = classLoader.loadClass(UNIT_JOB_CLASS_NAME);
             assertNotNull(unitJobClass);
 
             // and classes are loaded in the aplhabetical order
@@ -87,10 +93,10 @@
             Integer result1 = job1.execute(null);
             assertEquals(1, result1);
 
-            Class<?> job1UtilityClass = classLoader.loadClass("org.my.job.compute.unit.Job1Utility");
+            Class<?> job1UtilityClass = classLoader.loadClass(JOB1_UTILITY_CLASS_NAME);
             assertNotNull(job1UtilityClass);
 
-            Class<?> job2UtilityClass = classLoader.loadClass("org.my.job.compute.unit.Job2Utility");
+            Class<?> job2UtilityClass = classLoader.loadClass(JOB2_UTILITY_CLASS_NAME);
             assertNotNull(job2UtilityClass);
 
             // classes from the different units are loaded from the same class loader
@@ -107,13 +113,13 @@
 
         // then class from all jars are loaded
         try (JobClassLoader classLoader = jobClassLoaderFactory.createClassLoader(units)) {
-            Class<?> unitJobClass = classLoader.loadClass("org.my.job.compute.unit.UnitJob");
+            Class<?> unitJobClass = classLoader.loadClass(UNIT_JOB_CLASS_NAME);
             assertNotNull(unitJobClass);
 
-            Class<?> job1UtilityClass = classLoader.loadClass("org.my.job.compute.unit.Job1Utility");
+            Class<?> job1UtilityClass = classLoader.loadClass(JOB1_UTILITY_CLASS_NAME);
             assertNotNull(job1UtilityClass);
 
-            Class<?> job2UtilityClass = classLoader.loadClass("org.my.job.compute.unit.Job2Utility");
+            Class<?> job2UtilityClass = classLoader.loadClass(JOB2_UTILITY_CLASS_NAME);
             assertNotNull(job2UtilityClass);
         }
     }
@@ -127,13 +133,13 @@
 
         // then class from all jars are loaded
         try (JobClassLoader classLoader = jobClassLoaderFactory.createClassLoader(units)) {
-            Class<?> unitJobClass = classLoader.loadClass("org.my.job.compute.unit.UnitJob");
+            Class<?> unitJobClass = classLoader.loadClass(UNIT_JOB_CLASS_NAME);
             assertNotNull(unitJobClass);
 
-            Class<?> job1UtilityClass = classLoader.loadClass("org.my.job.compute.unit.Job1Utility");
+            Class<?> job1UtilityClass = classLoader.loadClass(JOB1_UTILITY_CLASS_NAME);
             assertNotNull(job1UtilityClass);
 
-            Class<?> job2UtilityClass = classLoader.loadClass("org.my.job.compute.unit.Job2Utility");
+            Class<?> job2UtilityClass = classLoader.loadClass(JOB2_UTILITY_CLASS_NAME);
             assertNotNull(job2UtilityClass);
         }
     }
@@ -147,7 +153,7 @@
 
         // then class loader throws an exception
         try (JobClassLoader classLoader = jobClassLoaderFactory.createClassLoader(units)) {
-            assertThrows(ClassNotFoundException.class, () -> classLoader.loadClass("org.my.job.compute.unit.UnitJob"));
+            assertThrows(ClassNotFoundException.class, () -> classLoader.loadClass(UNIT_JOB_CLASS_NAME));
         }
     }
 
diff --git a/modules/compute/src/test/resources/units/ignite-jobs-1.0-SNAPSHOT-src.zip b/modules/compute/src/test/resources/units/ignite-jobs-1.0-SNAPSHOT-src.zip
deleted file mode 100644
index a9fe96f..0000000
--- a/modules/compute/src/test/resources/units/ignite-jobs-1.0-SNAPSHOT-src.zip
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/1.0.0/ignite-ut-job1-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit1/1.0.0/ignite-ut-job1-1.0-SNAPSHOT.jar
deleted file mode 100644
index 1c33f9c..0000000
--- a/modules/compute/src/test/resources/units/unit1/1.0.0/ignite-ut-job1-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/2.0.0/ignite-ut-job2-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit1/2.0.0/ignite-ut-job2-1.0-SNAPSHOT.jar
deleted file mode 100644
index e4d23cf..0000000
--- a/modules/compute/src/test/resources/units/unit1/2.0.0/ignite-ut-job2-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/3.0.1/ignite-ut-job1-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit1/3.0.1/ignite-ut-job1-1.0-SNAPSHOT.jar
deleted file mode 100644
index 1c33f9c..0000000
--- a/modules/compute/src/test/resources/units/unit1/3.0.1/ignite-ut-job1-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/3.0.1/ignite-ut-job2-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit1/3.0.1/ignite-ut-job2-1.0-SNAPSHOT.jar
deleted file mode 100644
index e4d23cf..0000000
--- a/modules/compute/src/test/resources/units/unit1/3.0.1/ignite-ut-job2-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/3.0.2/ignite-ut-job1-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit1/3.0.2/ignite-ut-job1-1.0-SNAPSHOT.jar
deleted file mode 100644
index 1c33f9c..0000000
--- a/modules/compute/src/test/resources/units/unit1/3.0.2/ignite-ut-job1-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/3.0.2/subdir/ignite-ut-job2-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit1/3.0.2/subdir/ignite-ut-job2-1.0-SNAPSHOT.jar
deleted file mode 100644
index e4d23cf..0000000
--- a/modules/compute/src/test/resources/units/unit1/3.0.2/subdir/ignite-ut-job2-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit1/4.0.0/unit1-1.0-corrupted.jar b/modules/compute/src/test/resources/units/unit1/4.0.0/unit1-1.0-corrupted.jar
deleted file mode 100644
index 5cb9c2c..0000000
--- a/modules/compute/src/test/resources/units/unit1/4.0.0/unit1-1.0-corrupted.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit2/1.0.0/ignite-ut-job1-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit2/1.0.0/ignite-ut-job1-1.0-SNAPSHOT.jar
deleted file mode 100644
index 1c33f9c..0000000
--- a/modules/compute/src/test/resources/units/unit2/1.0.0/ignite-ut-job1-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/test/resources/units/unit2/2.0.0/ignite-ut-job2-1.0-SNAPSHOT.jar b/modules/compute/src/test/resources/units/unit2/2.0.0/ignite-ut-job2-1.0-SNAPSHOT.jar
deleted file mode 100644
index e4d23cf..0000000
--- a/modules/compute/src/test/resources/units/unit2/2.0.0/ignite-ut-job2-1.0-SNAPSHOT.jar
+++ /dev/null
Binary files differ
diff --git a/modules/compute/src/unit1/java/org/apache/ignite/internal/compute/Job1Utility.java b/modules/compute/src/unit1/java/org/apache/ignite/internal/compute/Job1Utility.java
new file mode 100644
index 0000000..0dee88c
--- /dev/null
+++ b/modules/compute/src/unit1/java/org/apache/ignite/internal/compute/Job1Utility.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+/** Utility class. */
+public class Job1Utility {
+}
diff --git a/modules/compute/src/unit1/java/org/apache/ignite/internal/compute/UnitJob.java b/modules/compute/src/unit1/java/org/apache/ignite/internal/compute/UnitJob.java
new file mode 100644
index 0000000..d116112
--- /dev/null
+++ b/modules/compute/src/unit1/java/org/apache/ignite/internal/compute/UnitJob.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.JobExecutionContext;
+
+/** Compute job. */
+public class UnitJob implements ComputeJob<Integer> {
+    @Override
+    public Integer execute(JobExecutionContext context, Object... args) {
+        return 1;
+    }
+}
diff --git a/modules/compute/src/unit2/java/org/apache/ignite/internal/compute/Job2Utility.java b/modules/compute/src/unit2/java/org/apache/ignite/internal/compute/Job2Utility.java
new file mode 100644
index 0000000..618020d
--- /dev/null
+++ b/modules/compute/src/unit2/java/org/apache/ignite/internal/compute/Job2Utility.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+/** Utility class. */
+public class Job2Utility {
+}
diff --git a/modules/compute/src/unit2/java/org/apache/ignite/internal/compute/UnitJob.java b/modules/compute/src/unit2/java/org/apache/ignite/internal/compute/UnitJob.java
new file mode 100644
index 0000000..51163e2
--- /dev/null
+++ b/modules/compute/src/unit2/java/org/apache/ignite/internal/compute/UnitJob.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.compute;
+
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.JobExecutionContext;
+
+/** Compute job. */
+public class UnitJob implements ComputeJob<String> {
+    @Override
+    public String execute(JobExecutionContext context, Object... args) {
+        return "Hello World!";
+    }
+}
