简体   繁体   中英

unable to use custom jar in spring boot project

I am trying to use one of the services of spring boot app into another spring boot service. Due to some restrictions i have to use jar based approach ie, i am building first project using command maven build and using the jar created for that project.

I'm adding that jar into the build path of other/dependent project. But I'm not able to see the services of my main project. neither i'm able to autowire them. Few days ago, somehow i was able to see the services but the maven build for dependent project was failing as it was unable to find the source package of autowired service in dependent project (an obvious failure as that package was in main project). i have tried many things but i'm not sure how to proceed now.

MainProject

JartestApplication.java

@SpringBootApplication
public class JartestApplication 
{

    public static void main(String[] args) throws Exception 
    {
        SpringApplication.run(JartestApplication.class, args);
    }

}

Service.java

@FunctionalInterface
public interface DbService 
{
    public BigInteger getRowCount(String tableName) throws Exception;
}

ServiceImpl.java

@Service
public class DbServiceImpl implements DbService
{

    @Autowired
    EntityManager em;

    @Override
    public BigInteger getRowCount(String tableName) throws Exception
    {
        return (BigInteger) em.createNativeQuery("select count(*) from "+tableName).getSingleResult();
    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>jartest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jartest</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

DependentProject

ImportjartestApplication.java


@SpringBootApplication
public class ImportjartestApplication 
{

    public static void main(String[] args)
    {
        ApplicationContext context = SpringApplication.run(ImportjartestApplication.class, args);
        Test test = context.getBean(Test.class);
        System.err.println(test.check("test"));
    }

}

Test.java


@FunctionalInterface
public interface Test 
{
    public BigInteger check(String name);
}

TestImpl.java

@Service
public class TestImpl implements Test 
{

    //@Autowired    ---  what i want  to do
    //DbService service;    --- service is not visible even after i have added the jar of main project into the build path of this project

    @Override
    public BigInteger check(String name) 
    {
        return null;
        //return service.getRowCount(name);  -- my actual aim
    }

}

Is there any other way so that i can share my service without sharing the code?

Due to some limitations i cannot expose my service as rest service so i am trying to deploy the main service as jar and adding it in build path of dependent project.

In your spring-boot-maven-plugin add following entries.

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <!--- begins --->
  <configuration>
    <includeSystemScope>true</includeSystemScope>
  </configuration>
  <!--- ends --->
</plugin>
after lots of debugging and reading the docs i found the solution and hereby i'm posting the steps to it....

1. Used the below build configuration in source project

    <build>
        <finalName>generator</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2. Included the dependency into target project as system scope 

        <dependency>
            <groupId>generator</groupId>
            <artifactId>generator</artifactId>
            <scope>system</scope>
            <version>1.0</version>
            <systemPath>${project.basedir}\src\lib\generator.jar
            </systemPath>
        </dependency>

3. Included the following build configuration in target project


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--- begins - -->
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <!--- ends - -->
            </plugin>
        </plugins>
    </build>

4. Used component scan at root level in target class

@SpringBootApplication
@ComponentScan("com.example.jar.service")
public class JartestApplication 
{
    public static void main(String[] args) throws IOException 
    {
          System.out.println("Hello world");
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM