Как отлаживать плагин maven без его переустановки?

Я новичок в разработке плагинов maven и использую IntelliJ IDEA для разработки своих плагинов, и я всегда использую удаленную отладку для отладки плагина maven. Я устанавливаю параметры VM в конфигурации запуска плагина и устанавливаю конфигурацию запуска Maven в тестовом проекте, как это делают большинство разработчиков плагинов maven.

Однако, если я изменяю какой-то код плагина maven, мне нужно остановить процесс отладки и переустановить плагин maven, что занимает очень много времени, если мой плагин maven крупномасштабный. После этого запускаю "отладку" в maven-плагине и запускаю "прогон" в тестовом проекте.

Поэтому я попытался использовать maven-plugin-testing-harness, чтобы написать тестовый код для моего плагина, например:

      <dependency>
    <groupId>org.apache.maven.plugin-testing</groupId>
    <artifactId>maven-plugin-testing-harness</artifactId>
    <version>3.3.0</version>
    <scope>test</scope> 
</dependency>
      public class Maven3MojoTest extends AbstractMojoTestCase {
    private File localRepoDir = new File("C:\\Users\\buriedpot\\.m2\\repository");
    private static final String POM_FILE_NAME = "src/test/resources/A/pom.xml";
    private static final String PROJ_DIR_NAME = "src/test/resources/A";

    @Rule
    public MojoRule rule = new MojoRule()
    {
        @Override
        protected void before() throws Throwable
        {
        }

        @Override
        protected void after()
        {
        }
    };


    /**
     * @throws Exception if any
     */
    @Test
    public void testSomething()
            throws Exception
    {
        File pom = new File(POM_FILE_NAME);
        Assert.assertNotNull( pom );
        Assert.assertTrue( pom.exists() );

        MavenProject project = rule.readMavenProject(new File(PROJ_DIR_NAME));
        MavenSession session = rule.newMavenSession(project);
        ArtifactRepository localRepository = createLocalArtifactRepository();
        session.getRequest().setLocalRepository(localRepository);
        DefaultRepositorySystemSession systemSession = MavenRepositorySystemUtils.newSession();
        DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
        locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
        locator.addService(TransporterFactory.class, FileTransporterFactory.class);
        locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
        RepositorySystem system = locator.getService(RepositorySystem.class);
        LocalRepository local = new LocalRepository(localRepoDir);
        systemSession.setLocalRepositoryManager(system.newLocalRepositoryManager(systemSession, local));
        MojoExecution execution = newMojoExecution("maven3Mojo");
        Maven3Mojo mojo = (Maven3Mojo) lookupConfiguredMojo(session, execution);

        Assert.assertNotNull( mojo );
        mojo.repoSession = systemSession;
        mojo.execute();
    }
    /**
     * Generate a local repository
     * @return local repository object
     */
    private ArtifactRepository createLocalArtifactRepository() {
        return new MavenArtifactRepository("local",
                localRepoDir.toURI().toString(),
                new DefaultRepositoryLayout(),
                new ArtifactRepositoryPolicy( true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE ),
                new ArtifactRepositoryPolicy( true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE )

        );
    }
    /** Do not need the MojoRule. */
    @WithoutMojo
    @Test
    public void testSomethingWhichDoesNotNeedTheMojoAndProbablyShouldBeExtractedIntoANewClassOfItsOwn()
    {
    }
}

И затем я ожидаю, что смогу запустить указанный тест в режиме отладки, чтобы найти способ отладки без переустановки моего плагина. Однако некоторые компоненты моего Mojo не вводятся.

      @Mojo(name = "maven3Mojo", defaultPhase = LifecyclePhase.VALIDATE)
public class Maven3Mojo extends AbstractMojo {
    @Parameter(defaultValue = "${session}", readonly = true, required = true)
    public MavenSession session;
    @Component
    public DependencyGraphBuilder dependencyGraphBuilder;
    @Parameter(defaultValue = "${localRepository}", readonly = true)
    public ArtifactRepository localRepository;
    @Parameter(defaultValue = "${project}", readonly = true, required = true)
    public MavenProject project;
    @Parameter(defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true)
    public List<ArtifactRepository> remoteRepositories;
 @Parameter(defaultValue = "${repositorySystemSession}", readonly = true, required = true)
    public RepositorySystemSession repoSession;
   }

Хотя я сослался на ответ maven-plugin-testing-harness session.getLocalRepository() возвращает null , в компоненте "repoSession" по-прежнему отсутствуют некоторые критические атрибуты...

Таким образом, похоже, что тест жгута не может правильно внедрить все необходимые компоненты в Maven Mojo. Итак, можно ли использовать какие-либо другие подходы для отладки без сложной процедуры переустановки?

0 ответов

Другие вопросы по тегам