包 org.aspectj.lang 不存在 - Aspectj

package org.aspectj.lang does not exist - Aspectj

我是 soft 新手。工程和做一个用户管理和 inside 安全包的项目,我有一个名为 SecurityAspects 的 class,我定义了 @Pointcut@Around.

我正在使用 Apache Ant 来编译整个程序。

SecurityAspects.java

package teste.servicepack.security.logic;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import teste.domain.UserSession;
import teste.servicepack.security.SecurityContextProvider;
import teste.servicepack.security.logic.Exception.FailRoleException;
import teste.servicepack.security.logic.Exception.NotAuthenticatedException;
import teste.servicepack.security.logic.Permission.HasRole;
import teste.utils.HibernateUtils;

import java.util.Arrays;
import java.util.logging.Logger;

@Aspect
public class SecurityAspects {

    private static final Logger logger = Logger.getLogger(String.valueOf(SecurityAspects.class));

    @Pointcut("@annotation(Transaction)")
    public void TransactionPointCut(){}

    @Pointcut("@annotation(IsAuthenticated)")
    public void isAuthenticatedPointCut(){}

    @Pointcut("@annotation(hasRole)")
    public void hasRolePointCut(HasRole hasRole){}


    @Pointcut("execution(* *(..))")
    public void executionPointCut(){}


    //Transaction
    @Around("TransactionPointCut() && executionPointCut()")
    public Object transactionAdvise(ProceedingJoinPoint pjp) throws Throwable{
        HibernateUtils.getCurrentSession().beginTransaction();
        try {
            Object obj = pjp.proceed();
            HibernateUtils.getCurrentSession().getTransaction().commit();
            logger.info("Transaction finished successfully!");
            return obj;
        }catch (Exception e){
            HibernateUtils.getCurrentSession().getTransaction().rollback();
            throw e;
        }
    }

    // isAuthenticated
    @Around("isAuthenticatedPointCut() && executionPointCut()")
    public Object isAuthenticatedAdvise(ProceedingJoinPoint pjp) throws Throwable
    {

        logger.info("isAuthenticated");
        String cookie = SecurityContextProvider.getInstance().getSecuritySessionContext().getRequester();
        UserSession session = (UserSession) HibernateUtils.getCurrentSession().load(UserSession.class,cookie);

        if(session.getUser() != null)
            return pjp.proceed();
        throw new NotAuthenticatedException("Access Denied, not authenticated at " + pjp.getSourceLocation().getFileName() + " " + pjp.getSourceLocation().getLine() + " service: " + pjp.getSignature().getName());
    }


    // HasRole
    @Around("hasRolePointCut(hasRole) && executionPointCut()")
    public Object hasRoleAdvise(ProceedingJoinPoint pjp,HasRole hasRole) throws Throwable
    {
        logger.info("hasRole");


        String cookie = SecurityContextProvider.getInstance().getSecuritySessionContext().getRequester();

        UserSession session = (UserSession) HibernateUtils.getCurrentSession().load(UserSession.class,cookie);

        String[] rolesIn = hasRole.role().split(",");
        String[] roles = session.getUser().getRoles().split(",");

        for(String checkRole: rolesIn){
            if(Arrays.asList(roles).contains(checkRole)) {
                return pjp.proceed();
            }
        }
        throw new FailRoleException("Access Denied, does not have role " + hasRole.role() + " at " + pjp.getSourceLocation().getFileName() + " " + pjp.getSourceLocation().getLine() + " service: " + pjp.getSignature().getName());
    }



}

build.xml

<?xml version="1.0"?>
<project default="deploy" basedir=".">

    <property file="local.properties"/>
    <property file="build.properties"/>

    <path id="pathref">

        <fileset dir="lib/hibernate">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="lib/mysql">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="lib/commons">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="lib/log4j">
            <include name="*.jar"/>
        </fileset>

        <fileset dir="lib/json">
            <include name="*.jar"/>
        </fileset>

        <fileset dir="${TOMCAT_HOME}/lib">
            <include name="servlet-api.jar"/>
        </fileset>


    </path>

    <taskdef name="hibernatetool"
             classname="org.hibernate.tool.ant.HibernateToolTask"
             classpathref="pathref" classpath="${build.dir.classes}"/>
    <taskdef name="schemaupdate"
             classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask"
             classpathref="pathref" classpath="${build.dir.classes}"/>



    <target name="generateUpdateHibernateSql" depends="compile">
        <schemaupdate
                properties="${build.dir.classes}/teste/domain/jdbc.properties"
                quiet="no"
                text="no">
            <fileset dir="src/java">
                <include name="**/*.hbm.xml"/>
            </fileset>
        </schemaupdate>
    </target>

    <target name="generateHibernateDomainObjects">
        <mkdir dir="src/gen"/>
        <replace dir="src/java" value="">
            <include name="**/*.hbm.xml"/>
            <replacefilter token='&lt;timestamp source="db"' value="&lt;timestamp"/>
        </replace>
        <hibernatetool>
            <configuration>
                <fileset dir="src/java">
                    <include name="**/*.hbm.xml"/>
                </fileset>
            </configuration>
            <hbm2java
                    jdk5="true"
                    ejb3="false"
                    destdir="src/gen"/>
        </hibernatetool>
        <delete>
            <fileset dir="src/gen">
                <include name="**/*Impl.java"/>
            </fileset>
        </delete>
        <replace dir="src/java" value="">
            <include name="**/*.hbm.xml"/>
            <replacefilter token='&lt;timestamp' value='&lt;timestamp source="db"'/>
        </replace>
    </target>


    <target name="initDirs">
        <mkdir dir="build"/>
        <mkdir dir="build/ant"/>
        <mkdir dir="build/ant/classes"/>
        <mkdir dir="build/ant/war"/>
        <mkdir dir="build/ant/war/WEB-INF"/>
        <mkdir dir="build/ant/war/WEB-INF/classes"/>
        <mkdir dir="build/ant/war/WEB-INF/lib"/>
    </target>


    <target name="deploy" depends="build.war">
        <copy todir="${TOMCAT_HOME}/webapps/">
            <fileset dir="build/ant/">
                <include name="war/**/*.*"/>
            </fileset>
        </copy>
        <touch file="${TOMCAT_HOME}/webapps/war/WEB-INF/web.xml"/>
    </target>

    <target name="build.war" depends="compile">
        <copy todir="build/ant/war/WEB-INF" file="conf/web.xml"/>
        <copy todir="build/ant/war">
            <fileset dir="src/web">
                <include name="**/*.*"/>
            </fileset>
        </copy>

        <copy todir="build/ant/war/WEB-INF/classes">
            <fileset dir="build/ant/classes">
                <include name="**/*.*"/>
            </fileset>
        </copy>

        <copy todir="build/ant/war/WEB-INF/lib">
            <fileset dir="lib/hibernate">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="lib/mysql">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="lib/log4j">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="lib/commons">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="lib/json">
                <include name="*.jar"/>
            </fileset>
        </copy>
        <touch file="build/ant/war/WEB-INF/web.xml"/>
    </target>

    <target name="war" depends="build.war">
        <war file="build/ant/war.war">
            <fileset dir="build/ant/war">
                <include name="**/*.*"/>
            </fileset>
        </war>
    </target>

    <target name="compile" depends="initDirs">
        <javac destdir="build/ant/classes"
               debug="true"
               encoding="UTF-8"
               source="1.8" target="1.8"
               classpathref="pathref">
            <src path="src/java"/>
            <src path="src/gen"/>
        </javac>
        <copy file="conf/log4j.properties" todir="build/ant/classes"/>
        <copy file="conf/hibernate.cfg.xml" todir="build/ant/classes/teste/domain"/>

        <copy todir="build/ant/classes">
            <fileset dir="src/java">
                <include name="**/*.xml"/>
            </fileset>
        </copy>



        <copy file="conf/jdbc.properties" todir="${build.dir.classes}/teste/domain"/>
        <replace file="${build.dir.classes}/teste/domain/jdbc.properties">
            <replacefilter token="@database.username@" value="${database.username}"/>
            <replacefilter token="@database.password@" value="${database.password}"/>
            <replacefilter token="@database.connection.url@" value="${database.connection.url}"/>
        </replace>
        <replace file="${build.dir.classes}/teste/domain/hibernate.cfg.xml">
            <replacefilter token="@database.username@" value="${database.username}"/>
            <replacefilter token="@database.password@" value="${database.password}"/>
            <replacefilter token="@database.connection.url@" value="${database.connection.url}"/>
            <replacefilter token="@hibernate.show.sql@" value="${hibernate.show.sql}"/>
        </replace>
    </target>

</project>

但我的问题是,当我尝试使用 Ant 进行编译时,出现以下错误:

/Users/dilantaskin/Downloads/TrabalhoES/src/java/teste/servicepack/security/logic/SecurityAspects.java:3: error: package org.aspectj.lang does not exist
/Users/dilantaskin/Downloads/TrabalhoES/src/java/teste/servicepack/security/logic/SecurityAspects.java:4: error: package org.aspectj.lang.annotation does not exist

就像我有超过 20 个错误只是因为 org.aspectj.lang.

在 ide 中,一切看起来都很好,没有什么不支持的。

我可以看到我有 aspectjrt.jaraspectj-1.9.7 inside 的外部图书馆。

我试图将 org.aspectj.lang 更改为 org.aspectj.lang3 但它无法识别。

任何人都可以解释一下为什么即使我有必要的 jar 也会出现错误?

INFO: 我没有使用 Maven 而且我认为(?)也没有 Spring。我有一个关于 IntelliJ 的基本 Java 项目,使用 TomcatHibernateServletAnt


kriegaex编辑:作者分享了一个MCVE on GitHub under Edifie/user-management-NF,使得问题可以重现(如果你先下载解压Tomcat,然后点Ant 构建它)。

我检查了 your project on GitHub,感谢 link。有太多的错误,我几乎不知道从哪里开始:

  1. 您提交了库 JAR 而不是使用 Maven 进行适当的依赖管理,Gradle 或者,如果您坚持使用 Ant,则使用 Ivy。依赖项应在构建期间下载,而不是提交到源代码管理 (SCM) 存储库中。使用 Maven 或 Gradle 也有这样的优势,即像 IntelliJ IDEA 或 Eclipse 这样的 IDE 可以自动导入您的项目,并且还知道在哪里可以找到依赖项并在项目之间共享它们,而不是将它们冗余地提交到您的每个项目 SCM 存储库并手动将它们添加到您的 IDE 项目配置中。太丑了

  2. 您项目中的一个 JAR 是 aspectj-1.9.6.jar。这不是您想要的,而是一个可执行安装程序,其目的是在本地安装 AspectJ。在那里,您还可以找到嵌套的 JAR,例如 aspectjrt.jar(运行时)、aspectjtools.jar(编译器)、aspectjweaver.jar(load-time 编织代理)。您必须执行该安装程序,然后将所需的库复制到 lib 目录。

  3. 为了让 Java 编译器识别您的 AspectJ 导入,您需要在 class 路径上安装 AspectJ 运行时,即您可以从 aspectjrt-1.9.6.jar 下载Maven Central(右上角菜单中的 select“下载 → jar”)。然后您只需将它复制到 lib 并将其添加到您的 Ant 脚本中:

    <fileset dir="lib">
      <include name="aspectjrt*.jar"/>
    </fileset>
    
  4. 现在项目可以编译了,但是是否达到你想要的效果取决于你是想使用 Spring AOP 还是本机 AspectJ。对于前者,不需要 AspectJ 编译器,但您的方面必须成为 Spring 组件。对于后者,用javac编译是不够的,你需要AspectJ编译器ajc。 AspectJ 提供了它自己的 Ant task for that. If you need the Ant task, you also want to have the AspectJ compiler on that task's classpath (not on the application classpath, only during build time). That would be aspectjtools-1.9.6.jar.

我不是 Ant 用户,所以我对这个古老的构建工具没有兴趣,但如果你是 Ant 用户,你就会知道如何完成这项工作。

你的申请还有很多问题,例如就像我在评论中所说的那样,@annotation(Transaction)@annotation(IsAuthenticated) 应该使用完全限定的 class 名称或导入 classes 并将注释绑定到切入点参数,如果那是你的意思需要。

我认为,您应该先休息一下,先学习一些 Ant 和 AspectJ 基础知识,可能还有 Git 基础知识。或者,如果您可以选择从 Ant 切换到 Maven,我强烈建议您这样做并忘记 Ant。如果您因为您的雇主要求您使用 Ant 而无法使用 Ant,我表示诚挚的哀悼。但实际上,它只是一个工具,如果你需要它,只要学会如何使用它就可以了。

P.S.: 当前AspectJ版本为1.9.8。喜欢的话可以升级